@@ -4,11 +4,11 @@ module Persistence
4
4
extend ActiveSupport ::Concern
5
5
6
6
class_methods do
7
- def before_attributes ( method = nil , only : [ :create , :update ] , &blk )
7
+ def before_attributes ( method = nil , only : [ :create , :update , :assign ] , &blk )
8
8
add_callback ( :attributes , :before , method , only , &blk )
9
9
end
10
10
11
- def after_attributes ( method = nil , only : [ :create , :update ] , &blk )
11
+ def after_attributes ( method = nil , only : [ :create , :update , :assign ] , &blk )
12
12
add_callback ( :attributes , :after , method , only , &blk )
13
13
end
14
14
@@ -69,15 +69,29 @@ def add_callback(kind, lifecycle, method, only, &blk)
69
69
end
70
70
end
71
71
72
+ def assign ( assign_params , meta = nil , action_name = nil )
73
+ id = assign_params [ :id ]
74
+ assign_params = assign_params . except ( :id )
75
+ model_instance = nil
76
+
77
+ run_callbacks :attributes , action_name , assign_params , meta do |params |
78
+ model_instance = if action_name != :create && id
79
+ self . class . _find ( id : id ) . data
80
+ else
81
+ call_with_meta ( :build , model , meta )
82
+ end
83
+ call_with_meta ( :assign_attributes , model_instance , params , meta )
84
+ model_instance
85
+ end
86
+
87
+ model_instance
88
+ end
89
+
72
90
def create ( create_params , meta = nil )
73
91
model_instance = nil
74
92
75
93
run_callbacks :persistence , :create , create_params , meta do
76
- run_callbacks :attributes , :create , create_params , meta do |params |
77
- model_instance = call_with_meta ( :build , model , meta )
78
- call_with_meta ( :assign_attributes , model_instance , params , meta )
79
- model_instance
80
- end
94
+ model_instance = assign ( create_params , meta , :create )
81
95
82
96
run_callbacks :save , :create , model_instance , meta do
83
97
model_instance = call_with_meta ( :save , model_instance , meta )
@@ -89,15 +103,9 @@ def create(create_params, meta = nil)
89
103
90
104
def update ( update_params , meta = nil )
91
105
model_instance = nil
92
- id = update_params [ :id ]
93
- update_params = update_params . except ( :id )
94
106
95
107
run_callbacks :persistence , :update , update_params , meta do
96
- run_callbacks :attributes , :update , update_params , meta do |params |
97
- model_instance = self . class . _find ( id : id ) . data
98
- call_with_meta ( :assign_attributes , model_instance , params , meta )
99
- model_instance
100
- end
108
+ model_instance = assign ( update_params , meta , :update )
101
109
102
110
run_callbacks :save , :update , model_instance , meta do
103
111
model_instance = call_with_meta ( :save , model_instance , meta )
0 commit comments