Skip to content

Commit

Permalink
Don't overwrite unsaved updates when loading an association but prese…
Browse files Browse the repository at this point in the history
…rve the order of the loaded records. [#4642 state:resolved]

Signed-off-by: Pratik Naik <pratiknaik@gmail.com>
  • Loading branch information
chewi authored and lifo committed Jun 9, 2010
1 parent 0f44d37 commit b41c3ba
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 3 deletions.
Expand Up @@ -349,7 +349,7 @@ def load_target
begin
if !loaded?
if @target.is_a?(Array) && @target.any?
@target = find_target + @target.find_all {|t| t.new_record? }
@target = find_target.map { |f| i = @target.index(f); i ? @target.delete_at(i) : f } + @target
else
@target = find_target
end
Expand Down
14 changes: 14 additions & 0 deletions activerecord/test/cases/nested_attributes_test.rb
Expand Up @@ -465,6 +465,20 @@ def test_should_not_load_association_when_updating_existing_records
assert_equal 'Grace OMalley', @child_1.reload.name
end

def test_should_not_overwrite_unsaved_updates_when_loading_association
@pirate.reload
@pirate.send(association_setter, [{ :id => @child_1.id, :name => 'Grace OMalley' }])
@pirate.send(@association_name).send(:load_target)
assert_equal 'Grace OMalley', @pirate.send(@association_name).target.find { |r| r.id == @child_1.id }.name
end

def test_should_preserve_order_when_not_overwriting_unsaved_updates
@pirate.reload
@pirate.send(association_setter, [{ :id => @child_1.id, :name => 'Grace OMalley' }])
@pirate.send(@association_name).send(:load_target)
assert_equal @pirate.send(@association_name).target.first.id, @child_1.id
end

def test_should_take_a_hash_with_composite_id_keys_and_assign_the_attributes_to_the_associated_models
@child_1.stubs(:id).returns('ABC1X')
@child_2.stubs(:id).returns('ABC2X')
Expand Down
4 changes: 2 additions & 2 deletions activerecord/test/models/pirate.rb
@@ -1,7 +1,7 @@
class Pirate < ActiveRecord::Base
belongs_to :parrot, :validate => true
belongs_to :non_validated_parrot, :class_name => 'Parrot'
has_and_belongs_to_many :parrots, :validate => true
has_and_belongs_to_many :parrots, :validate => true, :order => 'parrots.id ASC'
has_and_belongs_to_many :non_validated_parrots, :class_name => 'Parrot'
has_and_belongs_to_many :parrots_with_method_callbacks, :class_name => "Parrot",
:before_add => :log_before_add,
Expand All @@ -21,7 +21,7 @@ class Pirate < ActiveRecord::Base
has_one :ship
has_one :update_only_ship, :class_name => 'Ship'
has_one :non_validated_ship, :class_name => 'Ship'
has_many :birds
has_many :birds, :order => 'birds.id ASC'
has_many :birds_with_method_callbacks, :class_name => "Bird",
:before_add => :log_before_add,
:after_add => :log_after_add,
Expand Down

0 comments on commit b41c3ba

Please sign in to comment.