使用after_create更新购物车的order_id

时间:2014-05-22 21:42:35

标签: ruby-on-rails ruby ruby-on-rails-4 after-create

首先,我有一个存储在会话中的购物车。购物车包含订单项(产品)。结帐按钮会导致Order.new表单,其中cart_id传递给新订单(购物车has_one订单,订单belongs_to购物车)。

希望到目前为止一切顺利。

购物车参数包含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

rails console

>> @order.cart.order_id
=> nil

它真的重要吗?也许我是偏执狂,但我认为从购物车访问order_id以及订单中的cart_id是一种好习惯。

谢谢大家, 专利

1 个答案:

答案 0 :(得分:2)

您不需要在两个方向上存储order_id,事实上您可能会创建比您希望通过此设计解决的问题更多的问题。例如,您必须在订单购物车更改时或两者之间保持最新的价值。

即使没有order_id模型上的Cart,Rails也足够聪明地确定与哪个记录相关联:

cart = Cart.last
cart.order
#=> #<Order ...>

order = Order.last
order.cart
#=> #<Cart ...>

我还想指出,您可能甚至不需要将Cart持久化到数据库,因为它只在单个浏览器会话的上下文中有意义。您可以将其设计为一个普通的旧Ruby对象(只是一个类,而不是继承自ActiveRecord::Base)并进一步简化您的设计。