Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Modifies belong_to touch callback to touch old associations also #9091

  • Loading branch information...
commit 8fccbc1ad4fff215c63d17b9321fc69ad17e89dc 1 parent 7fc3390
@adamgamble adamgamble authored
View
22 activerecord/CHANGELOG.md
@@ -447,6 +447,28 @@
*Aaron Stone + Rafael Mendonça França*
* `Relation#merge` now only overwrites where values on the LHS of the
+=======
+* Belongs_to :touch behavior now touches old association when
+ transitioning to new association
+
+ class Passenger < ActiveRecord::Base
+ belongs_to :car, touch: true
+ end
+
+ car_1 = Car.create
+ car_2 = Car.create
+
+ passenger = Passenger.create :car => car_1
+
+ passenger.car = car_2
+ passenger.save
+
+ Previously only car_2 would be touched. Now both car_1 and car_2
+ will be touched.
+
+ *Adam Gamble*
+
+* Relation#merge now only overwrites where values on the LHS of the
merge. Consider:
left = Person.where(age: [13, 14, 15])
View
10 activerecord/lib/active_record/associations/builder/belongs_to.rb
@@ -48,6 +48,16 @@ def add_touch_callbacks(reflection)
def belongs_to_touch_after_save_or_destroy_for_#{name}
record = #{name}
+ foreign_key_field = #{reflection.foreign_key}
+ if changed_attributes.key?(foreign_key_field)
+ reflection_klass = #{reflection.klass}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ old_foreign_id = changed_attributes[foreign_key_field]
+ old_record = reflection_klass.where(foreign_key_field.to_sym => old_foreign_id).first
+ if old_record
+ old_record.touch #{options[:touch].inspect if options[:touch] != true}
+ end
+ end
+
unless record.nil? || record.new_record?
record.touch #{options[:touch].inspect if options[:touch] != true}
end
View
12 activerecord/test/cases/timestamp_test.rb
@@ -176,7 +176,7 @@ def self.name; 'Toy'; end
assert_not_equal time, owner.updated_at
end
- def test_changing_parent_of_a_record_touches_both_new_and_old_parent_record_and_grandparent_record
+ def test_changing_parent_of_a_record_touches_both_new_and_old_parent_record
klass = Class.new(ActiveRecord::Base) do
def self.name; 'Toy'; end
belongs_to :pet, touch: true
@@ -184,30 +184,22 @@ def self.name; 'Toy'; end
toy1 = klass.find(1)
old_pet = toy1.pet
- old_owner = old_pet.owner
toy2 = klass.find(2)
new_pet = toy2.pet
- new_owner = new_pet.owner
time = 3.days.ago
old_pet.update_columns(updated_at: time)
- old_owner.update_columns(updated_at: time)
new_pet.update_columns(updated_at: time)
- new_owner.update_columns(updated_at: time)
toy1.pet = new_pet
toy1.save!
old_pet.reload
- old_owner.reload
new_pet.reload
- new_owner.reload
- assert_not_equal time, old_pet.updated_at
- assert_not_equal time, old_owner.updated_at
assert_not_equal time, new_pet.updated_at
- assert_not_equal time, new_owner.updated_at
+ assert_not_equal time, old_pet.updated_at
end
def test_timestamp_attributes_for_create

0 comments on commit 8fccbc1

Please sign in to comment.
Something went wrong with that request. Please try again.