diff options
Diffstat (limited to 'activerecord/lib/active_record/associations/has_one_through_association.rb')
-rw-r--r-- | activerecord/lib/active_record/associations/has_one_through_association.rb | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/associations/has_one_through_association.rb b/activerecord/lib/active_record/associations/has_one_through_association.rb new file mode 100644 index 0000000000..10978b2d93 --- /dev/null +++ b/activerecord/lib/active_record/associations/has_one_through_association.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +module ActiveRecord + module Associations + # = Active Record Has One Through Association + class HasOneThroughAssociation < HasOneAssociation #:nodoc: + include ThroughAssociation + + private + def replace(record, save = true) + create_through_record(record, save) + self.target = record + end + + def create_through_record(record, save) + ensure_not_nested + + through_proxy = through_association + through_record = through_proxy.load_target + + if through_record && !record + through_record.destroy + elsif record + attributes = construct_join_attributes(record) + + if through_record && through_record.destroyed? + through_record = through_proxy.tap(&:reload).target + end + + if through_record + if through_record.new_record? + through_record.assign_attributes(attributes) + else + through_record.update(attributes) + end + elsif owner.new_record? || !save + through_proxy.build(attributes) + else + through_proxy.create(attributes) + end + end + end + end + end +end |