Использование 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) и еще больше упростим ваш дизайн.

Другие вопросы по тегам