Skip to content

Commit

Permalink
Merge pull request rails#6935 from frodsan/b1e509ad7a8c8264544f10f466…
Browse files Browse the repository at this point in the history
…6705cd806b5408

Backport rails#3329 to 3-2-stable
  • Loading branch information
rafaelfranca committed Jul 2, 2012
2 parents 9e0b3fc + b1e509a commit dacc947
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 15 deletions.
36 changes: 21 additions & 15 deletions activerecord/lib/active_record/autosave_association.rb
Expand Up @@ -332,25 +332,31 @@ def save_collection_association(reflection)

if records = associated_records_to_validate_or_save(association, @new_record_before_save, autosave)
begin
records.each do |record|
next if record.destroyed?
records_to_destroy = []

records.each do |record|
next if record.destroyed?

saved = true

if autosave && record.marked_for_destruction?
records_to_destroy << record
elsif autosave != false && (@new_record_before_save || record.new_record?)
if autosave
saved = association.insert_record(record, false)
else
association.insert_record(record) unless reflection.nested?
end
elsif autosave
saved = record.save(:validate => false)
end

saved = true
raise ActiveRecord::Rollback unless saved
end

if autosave && record.marked_for_destruction?
records_to_destroy.each do |record|
association.proxy.destroy(record)
elsif autosave != false && (@new_record_before_save || record.new_record?)
if autosave
saved = association.insert_record(record, false)
else
association.insert_record(record) unless reflection.nested?
end
elsif autosave
saved = record.save(:validate => false)
end

raise ActiveRecord::Rollback unless saved
end
rescue
records.each {|x| IdentityMap.remove(x) } if IdentityMap.enabled?
raise
Expand Down
10 changes: 10 additions & 0 deletions activerecord/test/cases/autosave_association_test.rb
Expand Up @@ -770,6 +770,16 @@ def destroy(*args)
assert_equal before, @pirate.reload.birds
end

def test_when_new_record_a_child_marked_for_destruction_should_not_affect_other_records_from_saving
@pirate = @ship.build_pirate(:catchphrase => "Arr' now I shall keep me eye on you matey!") # new record

3.times { |i| @pirate.birds.build(:name => "birds_#{i}") }
@pirate.birds[1].mark_for_destruction
@pirate.save!

assert_equal 2, @pirate.birds.reload.length
end

# Add and remove callbacks tests for association collections.
%w{ method proc }.each do |callback_type|
define_method("test_should_run_add_callback_#{callback_type}s_for_has_many") do
Expand Down

0 comments on commit dacc947

Please sign in to comment.