From 96b690d33cf516e1c6747054abeb58b25eae753f Mon Sep 17 00:00:00 2001 From: Kenneth Law Date: Tue, 20 Nov 2018 02:02:46 +0800 Subject: [PATCH 1/2] support rails 5 --- activerecord-delay_touching.gemspec | 2 +- lib/activerecord/delay_touching.rb | 37 +++++++++++++++++++++-------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/activerecord-delay_touching.gemspec b/activerecord-delay_touching.gemspec index 5e83d44..c69d2cd 100644 --- a/activerecord-delay_touching.gemspec +++ b/activerecord-delay_touching.gemspec @@ -18,7 +18,7 @@ Gem::Specification.new do |spec| spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"] - spec.add_dependency "activerecord", "~> 4.2" + spec.add_dependency "activerecord", ">= 4.2", "< 5.3" spec.add_development_dependency "bundler", "~> 1.6" spec.add_development_dependency "rake" diff --git a/lib/activerecord/delay_touching.rb b/lib/activerecord/delay_touching.rb index a326802..61e5c97 100644 --- a/lib/activerecord/delay_touching.rb +++ b/lib/activerecord/delay_touching.rb @@ -6,12 +6,14 @@ module DelayTouching extend ActiveSupport::Concern # Override ActiveRecord::Base#touch. - def touch(*names) - if self.class.delay_touching? && !try(:no_touching?) - DelayTouching.add_record(self, *names) - true - else - super + if ActiveRecord::VERSION::MAJOR >= 5 + def touch(*names, time: nil) + names = self.class.send(:timestamp_attributes_for_update_in_model) if names.empty? + DelayTouching.handle_touch(self, names) || super + end + else + def touch(*names) + DelayTouching.handle_touch(self, names) || super end end @@ -45,6 +47,13 @@ class << self delegate :add_record, to: :state end + def self.handle_touch(record, names) + if record.class.delay_touching? && !record.try(:no_touching?) + add_record(record, *names) + true + end + end + # Start delaying all touches. When done, apply them. (Unless nested.) def self.call state.nesting += 1 @@ -88,10 +97,8 @@ def self.touch_records(attr, klass, records) records.each do |record| # Don't bother if destroyed or not-saved next unless record.persisted? - record.instance_eval do - write_attribute column, current_time - @changed_attributes.except!(*changes.keys) - end + record.send(:write_attribute, column, current_time) + clear_attribute_changes(record, changes.keys) end end @@ -100,6 +107,16 @@ def self.touch_records(attr, klass, records) state.updated attr, records records.each { |record| record.run_callbacks(:touch) } end + + if ActiveRecord::VERSION::MAJOR >= 5 + def self.clear_attribute_changes(record, attr_names) + record.clear_attribute_changes(attr_names) + end + else + def self.clear_attribute_changes(record, attr_names) + record.instance_variable_get('@changed_attributes').except!(*attr_names) + end + end end end From eafaa97ef7bb7ef10974ab217be5f238e97c8809 Mon Sep 17 00:00:00 2001 From: Kenneth Law Date: Tue, 20 Nov 2018 14:37:15 +0800 Subject: [PATCH 2/2] bump version --- lib/activerecord/delay_touching/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/activerecord/delay_touching/version.rb b/lib/activerecord/delay_touching/version.rb index 99579bd..9a78b59 100644 --- a/lib/activerecord/delay_touching/version.rb +++ b/lib/activerecord/delay_touching/version.rb @@ -1,5 +1,5 @@ module Activerecord module DelayTouching - VERSION = "1.1.0" + VERSION = "1.1.1" end end