Контекст:
Каждый заказ имеет много предметов и логистики. Каждый товар и логистика (а также сам заказ) имеют много доходов.
Я создаю заказ + товары и логистику одновременно, используя accepts_nested_attributes_for
в заказе. Однако доходы создаются с использованием обратного вызова after_create
для каждой из моделей Order, Item и Logistics. Почему? Потому что, учитывая разницу в интерпретации этих моделей, так код читается чище. (Но если этот способ сделать это является причиной того, что этот вопрос задают, я, очевидно, пересмотрю свое решение!)
Один ключевой атрибут, который мне нужно сохранить в Revenues, — это pp_charge_id
. Но pp_charge_id
это не то, о чем должны беспокоиться ни Order, ни Items, ни Logistics. Я прикрепил 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
Код модели ПУНКТ/ЛОГИСТИКА:
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
в параметрах заказа и сохранить все сразу (включая доходы), дайте мне знать, потому что я знаю, как это сделать. (Опять же, лучше бы этого избежать из-за того, как это интерпретируется: параметры поступают от пользователя, данные о доходах - это то, что я предоставляю)