mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Don't track implicit touch
mutation
This partly reverts the effect ofd1107f4d
.d1107f4d
makes `touch` tracks the mutation whether the `touch` is occurred by explicit or not. Existing apps expects that the previous changes tracks only the changes which is explicit action by users. I'd revert the implicit `touch` mutation tracking since I'd not like to break existing apps. Fixes #36219.
This commit is contained in:
parent
9854efd5ac
commit
dcb825902d
3 changed files with 22 additions and 6 deletions
|
@ -177,6 +177,11 @@ module ActiveRecord
|
|||
|
||||
affected_rows = super
|
||||
|
||||
if @_skip_dirty_tracking ||= false
|
||||
clear_attribute_changes(@_touch_attr_names)
|
||||
return affected_rows
|
||||
end
|
||||
|
||||
changes = {}
|
||||
@attributes.keys.each do |attr_name|
|
||||
next if @_touch_attr_names.include?(attr_name)
|
||||
|
@ -193,7 +198,7 @@ module ActiveRecord
|
|||
|
||||
affected_rows
|
||||
ensure
|
||||
@_touch_attr_names = nil
|
||||
@_touch_attr_names, @_skip_dirty_tracking = nil, nil
|
||||
end
|
||||
|
||||
def _update_record(attribute_names = attribute_names_for_partial_writes)
|
||||
|
|
|
@ -44,6 +44,7 @@ module ActiveRecord
|
|||
|
||||
def touch_deferred_attributes
|
||||
if has_defer_touch_attrs? && persisted?
|
||||
@_skip_dirty_tracking = true
|
||||
touch(*@_defer_touch_attrs, time: @_touch_time)
|
||||
@_defer_touch_attrs, @_touch_time = nil, nil
|
||||
end
|
||||
|
|
|
@ -2711,18 +2711,22 @@ class HasManyAssociationsTest < ActiveRecord::TestCase
|
|||
bulb = Bulb.create!
|
||||
tyre = Tyre.create!
|
||||
|
||||
car = Car.create! do |c|
|
||||
car = Car.create!(name: "honda") do |c|
|
||||
c.bulbs << bulb
|
||||
c.tyres << tyre
|
||||
end
|
||||
|
||||
assert_equal [nil, "honda"], car.saved_change_to_name
|
||||
|
||||
assert_equal 1, car.bulbs.count
|
||||
assert_equal 1, car.tyres.count
|
||||
end
|
||||
|
||||
test "associations replace in memory when records have the same id" do
|
||||
bulb = Bulb.create!
|
||||
car = Car.create!(bulbs: [bulb])
|
||||
car = Car.create!(name: "honda", bulbs: [bulb])
|
||||
|
||||
assert_equal [nil, "honda"], car.saved_change_to_name
|
||||
|
||||
new_bulb = Bulb.find(bulb.id)
|
||||
new_bulb.name = "foo"
|
||||
|
@ -2733,7 +2737,9 @@ class HasManyAssociationsTest < ActiveRecord::TestCase
|
|||
|
||||
test "in memory replacement executes no queries" do
|
||||
bulb = Bulb.create!
|
||||
car = Car.create!(bulbs: [bulb])
|
||||
car = Car.create!(name: "honda", bulbs: [bulb])
|
||||
|
||||
assert_equal [nil, "honda"], car.saved_change_to_name
|
||||
|
||||
new_bulb = Bulb.find(bulb.id)
|
||||
|
||||
|
@ -2765,7 +2771,9 @@ class HasManyAssociationsTest < ActiveRecord::TestCase
|
|||
|
||||
test "in memory replacements sets inverse instance" do
|
||||
bulb = Bulb.create!
|
||||
car = Car.create!(bulbs: [bulb])
|
||||
car = Car.create!(name: "honda", bulbs: [bulb])
|
||||
|
||||
assert_equal [nil, "honda"], car.saved_change_to_name
|
||||
|
||||
new_bulb = Bulb.find(bulb.id)
|
||||
car.bulbs = [new_bulb]
|
||||
|
@ -2785,7 +2793,9 @@ class HasManyAssociationsTest < ActiveRecord::TestCase
|
|||
test "in memory replacement maintains order" do
|
||||
first_bulb = Bulb.create!
|
||||
second_bulb = Bulb.create!
|
||||
car = Car.create!(bulbs: [first_bulb, second_bulb])
|
||||
car = Car.create!(name: "honda", bulbs: [first_bulb, second_bulb])
|
||||
|
||||
assert_equal [nil, "honda"], car.saved_change_to_name
|
||||
|
||||
same_bulb = Bulb.find(first_bulb.id)
|
||||
car.bulbs = [second_bulb, same_bulb]
|
||||
|
|
Loading…
Reference in a new issue