aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/associations/has_one_through_association.rb
diff options
context:
space:
mode:
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.rb45
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