Использование after_create для обновления order_id корзины
Во-первых, у меня есть корзина, сохраненная в сеансе. Тележки содержат позиции (товары). Кнопка "Оформить заказ" приводит к появлению формы Order.new, в которой cart_id передается новому заказу (корзина has_one, корзина order__ cart).
Надеюсь, пока все хорошо.
Параметры корзины содержат значение order_id, которое изначально равно нулю, пока пользователь не нажмет кнопку "Оформить заказ". Когда заказ создан, order_id в корзине все еще равен нулю. Как я могу использовать after_create для модели заказа, чтобы обновить корзину, чтобы теперь иметь действительный идентификатор order_id?
У меня есть метод current_cart в контроллере приложения, поэтому у меня есть доступ к current_cart во всех моих контроллерах, но я не могу получить к нему доступ в модели -> поскольку он хранится в сеансе, и я слышал, что не хочу чтобы получить доступ к сеансам в модели в любом случае.
Как один рекомендует это делать?
Я покажу некоторый код на случай, если моё описание не было понятно.
orders_controller.rb
def create
@cart = current_cart
@order = @cart.build_order(order_params)
if @order.save
redirect_to @order, notice: "The order has been successfully created. Below are your shipping options."
else
render action: "new"
end
end
рельсы консольные
>> @order.cart.order_id
=> nil
Это вообще имеет значение? Может быть, я параноик, но я думаю, что было бы неплохо иметь доступ к order_id из корзины, а также cart_id из заказа.
Спасибо всем, Пэт
1 ответ
Вам не нужно хранить order_id в обоих направлениях, на самом деле вы, вероятно, создаете больше проблем, чем вы надеетесь решить с помощью этого дизайна. Например, вам нужно будет поддерживать актуальность значения в обоих направлениях, либо при изменении корзины заказа, либо наоборот.
Rails сам по себе достаточно умен, чтобы выяснить, какая запись с чем связана, даже без order_id
на Cart
модель:
cart = Cart.last
cart.order
#=> #<Order ...>
order = Order.last
order.cart
#=> #<Cart ...>
Я также хочу отметить, что вам, вероятно, даже не нужно настаивать Cart
в базу данных, поскольку это имеет смысл только в контексте одного сеанса браузера. Вместо этого вы можете создать его как обычный старый объект Ruby (просто класс, не наследующий от ActiveRecord::Base
) и еще больше упростим ваш дизайн.