首先,我有一个存储在会话中的购物车。购物车包含订单项(产品)。结帐按钮会导致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是一种好习惯。
谢谢大家, 专利
答案 0 :(得分:2)
您不需要在两个方向上存储order_id,事实上您可能会创建比您希望通过此设计解决的问题更多的问题。例如,您必须在订单购物车更改时或两者之间保持最新的价值。
即使没有order_id
模型上的Cart
,Rails也足够聪明地确定与哪个记录相关联:
cart = Cart.last
cart.order
#=> #<Order ...>
order = Order.last
order.cart
#=> #<Cart ...>
我还想指出,您可能甚至不需要将Cart
持久化到数据库,因为它只在单个浏览器会话的上下文中有意义。您可以将其设计为一个普通的旧Ruby对象(只是一个类,而不是继承自ActiveRecord::Base
)并进一步简化您的设计。