[英]Rails attr_accessor attribute on parent model available in children
語境:
每個訂單都有很多項目和物流。 每個項目和物流(以及訂單本身)都有很多收入。
我正在使用accepts_nested_attributes_for
上的accepts_nested_attributes_for
一次創建Order + Items&Logistics。 但是,在每個模型Order,Item和Logistics上使用after_create
回調創建after_create
。 為什么? 由於這些模型在解釋上存在差異,因此代碼以這種方式讀取得更清晰。 (但是,如果這樣做是導致問這個問題的原因,那么我顯然會重新考慮!)
我需要存儲在pp_charge_id
一個關鍵屬性是pp_charge_id
。 但是pp_charge_id
並不是訂單,物料或物流都需要擔心的東西。 我已將attr_accessor :pp_charge_id
到Order,以便可以正常運行,但是,一旦進入子項或物流模型,我將不再有權使用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
並非旨在在請求中持久存在,即使訂單本身已重新加載也是如此。 但是將它冗余地保存在沒有用的表中也沒有意義。 如果唯一的方法是將pp_charge_id
放入訂單的參數中,並一次保存所有內容(包括收入),那么請告訴我,因為我知道該怎么做。 (再次,由於其解釋方式,我們寧願避免這種情況:參數來自用戶,收入數據由我提供)
而不是使用after_create
和accessors,您應該考慮使用一種完全after_create
您需要的適當方法,即:
Order.create_with_charge(:cash, params)
我發現將冗余信息持久存儲在數據庫中令人不安,因為代碼會更干凈地讀取!
我想,如果您希望訂單的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
實例。 因此,如果您還向Item
類添加了attr_accessor
,則可以這樣編寫它的create_revenue
:
# item.rb
def create_revenue
revenues.create(pp_charge_id: pp_charge_id || order.pp_charge_id)
end
這應該涵蓋您在評論中提到的新要求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.