commit 9ae01621289fbef9923e8e77dcd55b4fec1dcd9e Author: Nolan Eakins Date: Mon Mar 23 21:33:05 2009 -0400 Added support to has one associations; moved the finding to the top of the method. diff --git a/activerecord/lib/active_record/associations/belongs_to_association.rb b/activerecord/lib/active_record/associations/belongs_to_association.rb index 98e1b5e..b11026a 100644 --- a/activerecord/lib/active_record/associations/belongs_to_association.rb +++ b/activerecord/lib/active_record/associations/belongs_to_association.rb @@ -10,6 +10,10 @@ module ActiveRecord end def replace(record) + if record.kind_of?(Fixnum) || record.kind_of?(String) + record = @reflection.klass.find(record) + end + counter_cache_name = @reflection.counter_cache_column if record.nil? @@ -18,8 +22,6 @@ module ActiveRecord end @target = @owner[@reflection.primary_key_name] = nil - elsif record.kind_of?(Fixnum) || record.kind_of?(String) - return replace(@reflection.klass.find(record)) else raise_on_type_mismatch(record) diff --git a/activerecord/lib/active_record/associations/has_one_association.rb b/activerecord/lib/active_record/associations/has_one_association.rb index b92cbbd..19b4a7c 100644 --- a/activerecord/lib/active_record/associations/has_one_association.rb +++ b/activerecord/lib/active_record/associations/has_one_association.rb @@ -25,6 +25,8 @@ module ActiveRecord end def replace(obj, dont_save = false) + obj = @reflection.klass.find(obj) if obj.kind_of?(Fixnum) || obj.kind_of?(String) + load_target unless @target.nil? || @target == obj diff --git a/activerecord/test/cases/associations/has_one_associations_test.rb b/activerecord/test/cases/associations/has_one_associations_test.rb index 1ddb3f4..6b197de 100644 --- a/activerecord/test/cases/associations/has_one_associations_test.rb +++ b/activerecord/test/cases/associations/has_one_associations_test.rb @@ -59,7 +59,7 @@ class HasOneAssociationsTest < ActiveRecord::TestCase end def test_type_mismatch - assert_raise(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).account = 1 } + assert_raise(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).account = 1.0 } assert_raise(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).account = Project.find(1) } end @@ -79,6 +79,24 @@ class HasOneAssociationsTest < ActiveRecord::TestCase assert_raise(ActiveRecord::RecordNotFound) { Account.find(old_account_id) } end + def test_fixnum_assignment + apple = Firm.create("name" => "Apple") + citibank = Account.create("credit_limit" => 10) + apple.account = citibank.id + citibank.reload # implicitly finding another instance under the hood + + assert_equal apple.id, citibank.firm_id + end + + def test_string_assignment + apple = Firm.create("name" => "Apple") + citibank = Account.create("credit_limit" => 10) + apple.account = citibank.id.to_s + citibank.reload # implicitly finding another instance under the hood + + assert_equal apple.id, citibank.firm_id + end + def test_nullification_on_association_change firm = companies(:rails_core) old_account_id = firm.account.id commit 04dece57bdf4ea644138363a37028c29433bb94f Author: Nolan Eakins Date: Mon Mar 23 17:22:35 2009 -0400 Changed the writter belongs_to creates to accept Fixnum and String values. diff --git a/activerecord/lib/active_record/associations/belongs_to_association.rb b/activerecord/lib/active_record/associations/belongs_to_association.rb index f05c6be..98e1b5e 100644 --- a/activerecord/lib/active_record/associations/belongs_to_association.rb +++ b/activerecord/lib/active_record/associations/belongs_to_association.rb @@ -18,6 +18,8 @@ module ActiveRecord end @target = @owner[@reflection.primary_key_name] = nil + elsif record.kind_of?(Fixnum) || record.kind_of?(String) + return replace(@reflection.klass.find(record)) else raise_on_type_mismatch(record) diff --git a/activerecord/test/cases/associations/belongs_to_associations_test.rb b/activerecord/test/cases/associations/belongs_to_associations_test.rb index 13a78a1..556c106 100644 --- a/activerecord/test/cases/associations/belongs_to_associations_test.rb +++ b/activerecord/test/cases/associations/belongs_to_associations_test.rb @@ -36,7 +36,7 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase end def test_type_mismatch - assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = 1 } + assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = 1.0 } assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = Project.find(1) } end @@ -47,6 +47,20 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase assert_equal apple.id, citibank.firm_id end + def test_fixnum_assignment + apple = Firm.create("name" => "Apple") + citibank = Account.create("credit_limit" => 10) + citibank.firm = apple.id + assert_equal apple.id, citibank.firm_id + end + + def test_string_assignment + apple = Firm.create("name" => "Apple") + citibank = Account.create("credit_limit" => 10) + citibank.firm = apple.id.to_s + assert_equal apple.id, citibank.firm_id + end + def test_no_unexpected_aliasing first_firm = companies(:first_firm) another_firm = companies(:another_firm)