上下文
每个订单都有很多商品和货品。后勤。每个项目&物流(以及订单本身)有很多收入。
我正在创建Order + Items&使用订单上的accepts_nested_attributes_for
立即进行物流。但是,在每个模型Order,Item和Logistics上使用after_create
回调创建收入。为什么?因为鉴于这些模型中的解释不同,代码以这种方式读取更清晰。 (但如果这样做的方式是引起这个问题的话,我显然会重新考虑!)
我需要在Revenues中存储的一个关键属性是pp_charge_id
。但pp_charge_id
不是订单,物品或物流需要担心的事情。我已将attr_accessor :pp_charge_id
附加到订单,以便一个正常,但是,一旦我在子项目或物流模型中,我再也无法再访问pp_charge_id
我需要保存相关的收入。我该怎么做?
控制器代码:
@order = Order.new(params) #params includes Order params, and nested params for child Item & Logistics
@order.pp_charge_id = "cash"
@order.save #I need this to not only save the Order, the children Item & Logistics, but then to also create the associated Revenue for each of the aforementioned 3 models
订购型号代码:
has_many :items
has_many :revenues
attr_accessor :pp_charge_id
after_create :create_revenue
def create_revenue
self.revenues.create(pp_charge_id: self.pp_charge_id)
end
#This WORKS as expected because of the attr_accessor
ITEM / LOGISTIC型号代码:
has_many :revenues
belongs_to :order
after_create :create_revenue
def create_revenue
self.revenues.create(pp_charge_id: self.order.pp_charge_id)
end
#This DOES NOT work because self.order.pp_charge_id is nil
订购型号代码:
belongs_to :order
belongs_to :item
belongs_to :logistic
我再次理解attr_accessor
不是为了在请求中持久存在,或者即使重新加载Order本身也是如此。但是将它冗余地保存在一个没有用的表中也没有意义。如果这样做的唯一方法是将pp_charge_id
放入订单的参数中并一次性保存所有内容(包括收入),那么请告诉我,因为我知道如何做到这一点。 (再次,只是因为它的解释方式而避免这种情况:params来自用户,收入数据是我提供的)
答案 0 :(得分:0)
而不是使用data=np.array([[ 0.55, -1], [-2.50, -3.05], [-0.79, -0.56],
[-1.01, -0.22], [-1.24, -0.23], [-1.29, -0.05], [ 1.65, 2.94]])
index=[np.array(['A', 'A', 'A', 'B', 'B', 'C', 'C']),
np.array(['22', '32', '76', '59', '72', '22', '63'])]
df=pd.DataFrame(data,index=index)
df
0 1
A 22 0.55 -1.00
32 -2.50 -3.05
76 -0.79 -0.56
B 59 -1.01 -0.22
72 -1.24 -0.23
C 22 -1.29 -0.05
63 1.65 2.94
T = df.T
for name in T.columns.levels[0]:
T.loc[T.index[-1], name][0]=0
df
0 1
A 22 0.55 0.00
32 -2.50 -3.05
76 -0.79 -0.56
B 59 -1.01 0.00
72 -1.24 -0.23
C 22 -1.29 0.00
63 1.65 2.94
和访问器,你应该考虑使用一个正确的方法来完成你所需要的,即:
after_create
我觉得在数据库中保留冗余信息是令人不安的,因为代码看起来更干净!
答案 1 :(得分:0)
我认为如果您希望订单pp_charge_id
适用于其所有商品和物流,我会将所有这些内容纳入订单的after_create
回调中:
# order.rb
def create_revenue
revenues.create(pp_charge_id: pp_charge_id)
items.each {|i| i.revenues.create(pp_charge_id: pp_charge_id)}
logistics.each {|l| l.revenues.create(pp_charge_id: pp_charge_id)}
end
编辑:或者,您可以在inverse_of
声明中添加belongs_to
,然后我相信Item#create_revenue
会看到相同的Order
个实例您在控制器中设置的。因此,如果您还在attr_accessor
课程中添加了Item
,则可以像这样编写create_revenue
:
# item.rb
def create_revenue
revenues.create(pp_charge_id: pp_charge_id || order.pp_charge_id)
end
这应该涵盖您在评论中提到的新要求。