diff --git a/activerecord/lib/active_record/associations/belongs_to_association.rb b/activerecord/lib/active_record/associations/belongs_to_association.rb index 11e16de7380dd9f73a89bdaecc4989d33447c702..271112bbe122bf4235390ae250706be4e8979e65 100644 --- a/activerecord/lib/active_record/associations/belongs_to_association.rb +++ b/activerecord/lib/active_record/associations/belongs_to_association.rb @@ -3,8 +3,7 @@ module ActiveRecord module Associations class BelongsToAssociation < SingularAssociation #:nodoc: def replace(record) - record = record.target if AssociationProxy === record - raise_on_type_mismatch(record) if record + record = check_record(record) update_counters(record) replace_keys(record) diff --git a/activerecord/lib/active_record/associations/has_one_association.rb b/activerecord/lib/active_record/associations/has_one_association.rb index 1b366b74b6dd9f54a1ff1eea03fa7ea282f3c2ca..892a8b5bfb3999570dd3c5526f03936dbac55972 100644 --- a/activerecord/lib/active_record/associations/has_one_association.rb +++ b/activerecord/lib/active_record/associations/has_one_association.rb @@ -3,8 +3,7 @@ module ActiveRecord module Associations class HasOneAssociation < SingularAssociation #:nodoc: def replace(record, save = true) - record = record.target if AssociationProxy === record - raise_on_type_mismatch(record) unless record.nil? + record = check_record(record) load_target @reflection.klass.transaction do diff --git a/activerecord/lib/active_record/associations/singular_association.rb b/activerecord/lib/active_record/associations/singular_association.rb index 023f7caf687a1ea24fb607834d7b42df606de56a..4b457bd881b5ea7e1b6d4149f23fc32c6c9c0ace 100644 --- a/activerecord/lib/active_record/associations/singular_association.rb +++ b/activerecord/lib/active_record/associations/singular_association.rb @@ -26,6 +26,12 @@ def replace(record) def set_new_record(record) replace(record) end + + def check_record(record) + record = record.target if AssociationProxy === record + raise_on_type_mismatch(record) if record + record + end end end end