子模型中的父模型上的Rails attr_accessor属性

时间:2016-02-11 19:06:02

标签: ruby-on-rails ruby-on-rails-4 parent-child attr-accessor

上下文

每个订单都有很多商品和货品。后勤。每个项目&物流(以及订单本身)有很多收入。

我正在创建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来自用户,收入数据是我提供的)

2 个答案:

答案 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

这应该涵盖您在评论中提到的新要求。