簡體   English   中英

父模型上的Rails attr_accessor屬性可用於子級

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM