Skip to content

Commit 82b0ce9

Browse files
jonleightontenderlove
authored andcommitted
Refactor HasOneAssociation#replace
1 parent 5b28e52 commit 82b0ce9

File tree

1 file changed

+22
-26
lines changed

1 file changed

+22
-26
lines changed

activerecord/lib/active_record/associations/has_one_association.rb

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,41 +14,27 @@ def build(attributes = {})
1414
new_record(:build_association, attributes)
1515
end
1616

17-
def replace(obj, save = true)
17+
def replace(record, save = true)
18+
record = record.target if AssociationProxy === record
19+
raise_on_type_mismatch(record) unless record.nil?
1820
load_target
1921

20-
unless @target.nil? || @target == obj
21-
if @reflection.options[:dependent] && save
22-
case @reflection.options[:dependent]
23-
when :delete
24-
@target.delete if @target.persisted?
25-
when :destroy
26-
@target.destroy if @target.persisted?
27-
when :nullify
28-
@target[@reflection.foreign_key] = nil
29-
@target.save if @owner.persisted? && @target.persisted?
30-
end
31-
else
32-
@target[@reflection.foreign_key] = nil
33-
@target.save if @owner.persisted? && @target.persisted?
34-
end
22+
if @target && @target != record
23+
remove_target(save && @reflection.options[:dependent])
3524
end
3625

37-
if obj.nil?
38-
@target = nil
39-
else
40-
raise_on_type_mismatch(obj)
41-
set_owner_attributes(obj)
42-
@target = (AssociationProxy === obj ? obj.target : obj)
26+
if record
27+
set_owner_attributes(record)
28+
set_inverse_instance(record)
4329
end
4430

45-
set_inverse_instance(obj)
31+
@target = record
4632
loaded
4733

48-
unless !@owner.persisted? || obj.nil? || !save
49-
return (obj.save ? self : false)
34+
if @owner.persisted? && record && save
35+
record.save && self
5036
else
51-
return (obj.nil? ? nil : self)
37+
record && self
5238
end
5339
end
5440

@@ -68,6 +54,16 @@ def new_record(method, attributes)
6854
replace(record, false)
6955
record
7056
end
57+
58+
def remove_target(method)
59+
case method
60+
when :delete, :destroy
61+
@target.send(method)
62+
else
63+
@target[@reflection.foreign_key] = nil
64+
@target.save if @target.persisted? && @owner.persisted?
65+
end
66+
end
7167
end
7268
end
7369
end

0 commit comments

Comments
 (0)