mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Explicitely setting `autosave => false' should override new_record autosaving. [#2214 state:resolved]
Original author is Jacob.
This commit is contained in:
parent
1b78e9bba3
commit
6cc0b9638f
4 changed files with 75 additions and 6 deletions
|
@ -285,7 +285,7 @@ module ActiveRecord
|
||||||
records.each do |record|
|
records.each do |record|
|
||||||
if autosave && record.marked_for_destruction?
|
if autosave && record.marked_for_destruction?
|
||||||
association.destroy(record)
|
association.destroy(record)
|
||||||
elsif @new_record_before_save || record.new_record?
|
elsif autosave != false && (@new_record_before_save || record.new_record?)
|
||||||
if autosave
|
if autosave
|
||||||
association.send(:insert_record, record, false, false)
|
association.send(:insert_record, record, false, false)
|
||||||
else
|
else
|
||||||
|
@ -316,7 +316,7 @@ module ActiveRecord
|
||||||
|
|
||||||
if autosave && association.marked_for_destruction?
|
if autosave && association.marked_for_destruction?
|
||||||
association.destroy
|
association.destroy
|
||||||
elsif new_record? || association.new_record? || association[reflection.primary_key_name] != id || autosave
|
elsif autosave != false && (new_record? || association.new_record? || association[reflection.primary_key_name] != id || autosave)
|
||||||
association[reflection.primary_key_name] = id
|
association[reflection.primary_key_name] = id
|
||||||
association.save(!autosave)
|
association.save(!autosave)
|
||||||
end
|
end
|
||||||
|
@ -337,7 +337,7 @@ module ActiveRecord
|
||||||
|
|
||||||
if autosave && association.marked_for_destruction?
|
if autosave && association.marked_for_destruction?
|
||||||
association.destroy
|
association.destroy
|
||||||
else
|
elsif autosave != false
|
||||||
association.save(!autosave) if association.new_record? || autosave
|
association.save(!autosave) if association.new_record? || autosave
|
||||||
|
|
||||||
if association.updated?
|
if association.updated?
|
||||||
|
|
|
@ -443,6 +443,70 @@ class TestDefaultAutosaveAssociationOnAHasManyAssociation < ActiveRecord::TestCa
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class TestDefaultAutosaveAssociationOnNewRecord < ActiveRecord::TestCase
|
||||||
|
def test_autosave_new_record_on_belongs_to_can_be_disabled_per_relationship
|
||||||
|
new_account = Account.new("credit_limit" => 1000)
|
||||||
|
new_firm = Firm.new("name" => "some firm")
|
||||||
|
|
||||||
|
assert new_firm.new_record?
|
||||||
|
new_account.firm = new_firm
|
||||||
|
new_account.save!
|
||||||
|
|
||||||
|
assert !new_firm.new_record?
|
||||||
|
|
||||||
|
new_account = Account.new("credit_limit" => 1000)
|
||||||
|
new_autosaved_firm = Firm.new("name" => "some firm")
|
||||||
|
|
||||||
|
assert new_autosaved_firm.new_record?
|
||||||
|
new_account.unautosaved_firm = new_autosaved_firm
|
||||||
|
new_account.save!
|
||||||
|
|
||||||
|
assert new_autosaved_firm.new_record?
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_autosave_new_record_on_has_one_can_be_disabled_per_relationship
|
||||||
|
firm = Firm.new("name" => "some firm")
|
||||||
|
account = Account.new("credit_limit" => 1000)
|
||||||
|
|
||||||
|
assert account.new_record?
|
||||||
|
firm.account = account
|
||||||
|
firm.save!
|
||||||
|
|
||||||
|
assert !account.new_record?
|
||||||
|
|
||||||
|
firm = Firm.new("name" => "some firm")
|
||||||
|
account = Account.new("credit_limit" => 1000)
|
||||||
|
|
||||||
|
firm.unautosaved_account = account
|
||||||
|
|
||||||
|
assert account.new_record?
|
||||||
|
firm.unautosaved_account = account
|
||||||
|
firm.save!
|
||||||
|
|
||||||
|
assert account.new_record?
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_autosave_new_record_on_has_many_can_be_disabled_per_relationship
|
||||||
|
firm = Firm.new("name" => "some firm")
|
||||||
|
account = Account.new("credit_limit" => 1000)
|
||||||
|
|
||||||
|
assert account.new_record?
|
||||||
|
firm.accounts << account
|
||||||
|
|
||||||
|
firm.save!
|
||||||
|
assert !account.new_record?
|
||||||
|
|
||||||
|
firm = Firm.new("name" => "some firm")
|
||||||
|
account = Account.new("credit_limit" => 1000)
|
||||||
|
|
||||||
|
assert account.new_record?
|
||||||
|
firm.unautosaved_accounts << account
|
||||||
|
|
||||||
|
firm.save!
|
||||||
|
assert account.new_record?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
class TestDestroyAsPartOfAutosaveAssociation < ActiveRecord::TestCase
|
class TestDestroyAsPartOfAutosaveAssociation < ActiveRecord::TestCase
|
||||||
self.use_transactional_fixtures = false
|
self.use_transactional_fixtures = false
|
||||||
|
|
||||||
|
|
|
@ -176,9 +176,9 @@ class ReflectionTest < ActiveRecord::TestCase
|
||||||
|
|
||||||
def test_reflection_of_all_associations
|
def test_reflection_of_all_associations
|
||||||
# FIXME these assertions bust a lot
|
# FIXME these assertions bust a lot
|
||||||
assert_equal 31, Firm.reflect_on_all_associations.size
|
assert_equal 34, Firm.reflect_on_all_associations.size
|
||||||
assert_equal 24, Firm.reflect_on_all_associations(:has_many).size
|
assert_equal 26, Firm.reflect_on_all_associations(:has_many).size
|
||||||
assert_equal 7, Firm.reflect_on_all_associations(:has_one).size
|
assert_equal 8, Firm.reflect_on_all_associations(:has_one).size
|
||||||
assert_equal 0, Firm.reflect_on_all_associations(:belongs_to).size
|
assert_equal 0, Firm.reflect_on_all_associations(:belongs_to).size
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -79,6 +79,10 @@ class Firm < Company
|
||||||
# Oracle tests were failing because of that as the second fixture was selected
|
# Oracle tests were failing because of that as the second fixture was selected
|
||||||
has_one :account_using_primary_key, :primary_key => "firm_id", :class_name => "Account", :order => "id"
|
has_one :account_using_primary_key, :primary_key => "firm_id", :class_name => "Account", :order => "id"
|
||||||
has_one :deletable_account, :foreign_key => "firm_id", :class_name => "Account", :dependent => :delete
|
has_one :deletable_account, :foreign_key => "firm_id", :class_name => "Account", :dependent => :delete
|
||||||
|
|
||||||
|
has_one :unautosaved_account, :foreign_key => "firm_id", :class_name => 'Account', :autosave => false
|
||||||
|
has_many :accounts
|
||||||
|
has_many :unautosaved_accounts, :foreign_key => "firm_id", :class_name => 'Account', :autosave => false
|
||||||
end
|
end
|
||||||
|
|
||||||
class DependentFirm < Company
|
class DependentFirm < Company
|
||||||
|
@ -149,6 +153,7 @@ end
|
||||||
|
|
||||||
class Account < ActiveRecord::Base
|
class Account < ActiveRecord::Base
|
||||||
belongs_to :firm
|
belongs_to :firm
|
||||||
|
belongs_to :unautosaved_firm, :foreign_key => "firm_id", :class_name => "Firm", :autosave => false
|
||||||
|
|
||||||
def self.destroyed_account_ids
|
def self.destroyed_account_ids
|
||||||
@destroyed_account_ids ||= Hash.new { |h,k| h[k] = [] }
|
@destroyed_account_ids ||= Hash.new { |h,k| h[k] = [] }
|
||||||
|
|
Loading…
Reference in a new issue