Skip to content
Browse files

association load target shouldn't replace records

from db if it is already loaded by nested attributes assignment

[#5053 state:resolved]

Signed-off-by: José Valim <jose.valim@gmail.com>
  • Loading branch information...
1 parent c0bfa0b commit 0057d2df71ec7c2a788acd3b4bade263fc0fe361 @szetobo szetobo committed with josevalim
View
7 activerecord/lib/active_record/associations/association_collection.rb
@@ -396,11 +396,12 @@ def load_target
if @target.is_a?(Array) && @target.any?
@target = find_target.map do |f|
i = @target.index(f)
- t = @target.delete_at(i) if i
- if t && t.changed?
+ if i
+ t = @target.delete_at(i)
+ keys = ["id"] + t.changes.keys + (f.attribute_names - t.attribute_names)
+ t.attributes = f.attributes.except(*keys)
t
else
- f.mark_for_destruction if t && t.marked_for_destruction?
f
end
end + @target
View
14 activerecord/test/cases/nested_attributes_test.rb
@@ -862,7 +862,19 @@ def setup
assert_equal 1, @ship.parts.proxy_target.size
assert_equal 'Deck', @ship.parts[0].name
end
-
+
+ test "if association is not loaded and child doesn't change and I am saving a grandchild then in memory record should be used" do
+ @ship.parts_attributes=[{:id => @part.id,:trinkets_attributes =>[{:id => @trinket.id, :name => 'Ruby'}]}]
+ assert_equal 1, @ship.parts.proxy_target.size
+ assert_equal 'Mast', @ship.parts[0].name
+ assert_no_difference("@ship.parts[0].trinkets.proxy_target.size") do
+ @ship.parts[0].trinkets.proxy_target.size
+ end
+ assert_equal 'Ruby', @ship.parts[0].trinkets[0].name
+ @ship.save
+ assert_equal 'Ruby', @ship.parts[0].trinkets[0].name
+ end
+
test "when grandchild changed in memory, saving parent should save grandchild" do
@trinket.name = "changed"
@ship.save

0 comments on commit 0057d2d

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