@@ -14,41 +14,27 @@ def build(attributes = {})
14
14
new_record ( :build_association , attributes )
15
15
end
16
16
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?
18
20
load_target
19
21
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 ] )
35
24
end
36
25
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 )
43
29
end
44
30
45
- set_inverse_instance ( obj )
31
+ @target = record
46
32
loaded
47
33
48
- unless ! @owner . persisted? || obj . nil? || ! save
49
- return ( obj . save ? self : false )
34
+ if @owner . persisted? && record && save
35
+ record . save && self
50
36
else
51
- return ( obj . nil? ? nil : self )
37
+ record && self
52
38
end
53
39
end
54
40
@@ -68,6 +54,16 @@ def new_record(method, attributes)
68
54
replace ( record , false )
69
55
record
70
56
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
71
67
end
72
68
end
73
69
end
0 commit comments