diff --git a/lib/paper_trail/has_paper_trail.rb b/lib/paper_trail/has_paper_trail.rb index ebe0bfd1..b64c74f2 100644 --- a/lib/paper_trail/has_paper_trail.rb +++ b/lib/paper_trail/has_paper_trail.rb @@ -61,13 +61,13 @@ module PaperTrail if ::ActiveRecord::VERSION::MAJOR >= 4 # `has_many` syntax for specifying order uses a lambda in Rails 4 has_many self.versions_association_name, - lambda { order("#{PaperTrail.timestamp_field} ASC") }, + lambda { |model| order(model.version_class_name.constantize.timestamp_sort_order) }, :class_name => self.version_class_name, :as => :item else has_many self.versions_association_name, :class_name => self.version_class_name, :as => :item, - :order => "#{PaperTrail.timestamp_field} ASC" + :order => self.paper_trail_version_class.timestamp_sort_order end options_on = Array(options[:on]) # so that a single symbol can be passed in without wrapping it in an `Array` diff --git a/lib/paper_trail/version_concern.rb b/lib/paper_trail/version_concern.rb index f45bb1e8..af0516c9 100644 --- a/lib/paper_trail/version_concern.rb +++ b/lib/paper_trail/version_concern.rb @@ -41,8 +41,7 @@ module PaperTrail end obj = obj.send(PaperTrail.timestamp_field) if obj.is_a?(self) - where("#{table_name}.#{PaperTrail.timestamp_field} > ?", obj). - order(self.timestamp_sort_order) + where("#{table_name}.#{PaperTrail.timestamp_field} > ?", obj).order(self.timestamp_sort_order) end def preceding(obj, timestamp_arg = false) @@ -51,8 +50,7 @@ module PaperTrail end obj = obj.send(PaperTrail.timestamp_field) if obj.is_a?(self) - where("#{table_name}.#{PaperTrail.timestamp_field} < ?", obj). - order(self.timestamp_sort_order('DESC')) + where("#{table_name}.#{PaperTrail.timestamp_field} < ?", obj).order(self.timestamp_sort_order('DESC')) end @@ -63,9 +61,11 @@ module PaperTrail # defaults to using the primary key as the secondary sort order if possible def timestamp_sort_order(order = 'ASC') - self.primary_key_is_int? ? - "#{table_name}.#{PaperTrail.timestamp_field} #{order}, #{table_name}.#{self.primary_key} #{order}" : + if self.primary_key_is_int? + "#{table_name}.#{PaperTrail.timestamp_field} #{order}, #{table_name}.#{self.primary_key} #{order}" + else "#{table_name}.#{PaperTrail.timestamp_field} #{order}" + end end def primary_key_is_int? diff --git a/test/unit/version_test.rb b/test/unit/version_test.rb index 8022d9d3..eaaa947d 100644 --- a/test/unit/version_test.rb +++ b/test/unit/version_test.rb @@ -65,7 +65,7 @@ class PaperTrail::VersionTest < ActiveSupport::TestCase setup { 2.times { @animal.update_attributes(:name => Faker::Lorem.word) } } context "receiving a TimeStamp" do - should "return all versions that were created before the Timestamp; descendingly by order of the `PaperTrail.timestamp_field`" do + should "return all versions that were created before the Timestamp" do value = PaperTrail::Version.subsequent(1.hour.ago, true) assert_equal value, @animal.versions.to_a assert_not_nil value.to_sql.match(/ORDER BY versions.created_at ASC/) @@ -84,8 +84,8 @@ class PaperTrail::VersionTest < ActiveSupport::TestCase setup { 2.times { @animal.update_attributes(:name => Faker::Lorem.word) } } context "receiving a TimeStamp" do - should "return all versions that were created before the Timestamp; descendingly by order of the `PaperTrail.timestamp_field`" do - value = PaperTrail::Version.preceding(Time.now, true) + should "return all versions that were created before the Timestamp" do + value = PaperTrail::Version.preceding(5.seconds.from_now, true) assert_equal value, @animal.versions.reverse assert_not_nil value.to_sql.match(/ORDER BY versions.created_at DESC/) end