mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Bugfix foreign key replacement in inverse association
when model is added to collection association
This commit is contained in:
parent
17ad4eb6fb
commit
a84c76573f
3 changed files with 17 additions and 13 deletions
|
@ -12,17 +12,20 @@ module ActiveRecord
|
|||
if record
|
||||
raise_on_type_mismatch!(record)
|
||||
update_counters_on_replace(record)
|
||||
replace_keys(record)
|
||||
set_inverse_instance(record)
|
||||
@updated = true
|
||||
else
|
||||
decrement_counters
|
||||
remove_keys
|
||||
end
|
||||
|
||||
self.target = record
|
||||
end
|
||||
|
||||
def target=(record)
|
||||
replace_keys(record)
|
||||
super
|
||||
end
|
||||
|
||||
def default(&block)
|
||||
writer(owner.instance_exec(&block)) if reader.nil?
|
||||
end
|
||||
|
@ -78,11 +81,8 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
def replace_keys(record)
|
||||
owner[reflection.foreign_key] = record._read_attribute(reflection.association_primary_key(record.class))
|
||||
end
|
||||
|
||||
def remove_keys
|
||||
owner[reflection.foreign_key] = nil
|
||||
owner[reflection.foreign_key] = record ?
|
||||
record._read_attribute(reflection.association_primary_key(record.class)) : nil
|
||||
end
|
||||
|
||||
def foreign_key_present?
|
||||
|
|
|
@ -13,12 +13,7 @@ module ActiveRecord
|
|||
|
||||
def replace_keys(record)
|
||||
super
|
||||
owner[reflection.foreign_type] = record.class.base_class.name
|
||||
end
|
||||
|
||||
def remove_keys
|
||||
super
|
||||
owner[reflection.foreign_type] = nil
|
||||
owner[reflection.foreign_type] = record ? record.class.base_class.name : nil
|
||||
end
|
||||
|
||||
def different_target?(record)
|
||||
|
|
|
@ -2509,6 +2509,15 @@ class HasManyAssociationsTest < ActiveRecord::TestCase
|
|||
assert_same car, new_bulb.car
|
||||
end
|
||||
|
||||
test "reattach to new objects replaces inverse association and foreign key" do
|
||||
bulb = Bulb.create!(car: Car.create!)
|
||||
assert bulb.car_id
|
||||
car = Car.new
|
||||
car.bulbs << bulb
|
||||
assert_equal car, bulb.car
|
||||
assert_nil bulb.car_id
|
||||
end
|
||||
|
||||
test "in memory replacement maintains order" do
|
||||
first_bulb = Bulb.create!
|
||||
second_bulb = Bulb.create!
|
||||
|
|
Loading…
Reference in a new issue