0

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

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

购物车参数包含一个 order_id,最初为 nil,直到用户点击结帐按钮。创建订单时,购物车中的 order_id 仍为 nil。如何在订单模型上使用 after_create 将购物车更新为现在具有有效的 order_id?

我的应用程序控制器中有一个 current_cart 方法,所以我可以在我的所有控制器中访问 c​​urrent_cart,但我无法在模型中访问它 - > 因为它存储在会话中,我听说我不想要无论如何都要访问模型中的会话。

有人建议这样做吗?

如果我的描述不清楚,我会显示一些代码。

订单控制器.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 以及从订单中访问 c​​art_id 是一个好习惯。

谢谢大家,帕特

4

1 回答 1

2

您不需要在两个方向上存储 order_id,事实上,您可能会产生比您希望通过此设计解决的问题更多的问题。例如,当订单的购物车发生变化或相反时,您必须在两个方向上保持值最新。

order_idRails 本身就足够聪明,即使在模型上没有 a 的情况下,它也可以确定哪个记录与哪个记录相关联Cart

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

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

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

于 2014-05-22T21:59:54.943 回答