0

まず、カートをセッションに保存します。カートには品目 (製品) が含まれています。チェックアウト ボタンは、cart_id が新しい注文に渡された Order.new フォームにつながります (cart has_one order、order belongs_to cart)。

うまくいけば、これまでのところとても良いです。

カートのパラメーターには、ユーザーがチェックアウト ボタンを押すまで、最初は nil である order_id が含まれます。注文が作成されたとき、カートの order_id はまだ nil です。注文モデルで 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

それは本当に重要ですか?たぶん私は偏執的ですが、注文からのcart_idだけでなく、カートからのorder_idにもアクセスできるようにすることをお勧めします。

ありがとう、パット

4

1 に答える 1

2

order_id を両方向に格納する必要はありません。実際、この設計で解決したいと考えているよりも多くの問題が発生している可能性があります。たとえば、注文のカートが変更された場合、またはその逆の場合に、両方向で値を最新の状態に保つ必要があります。

Rails は、モデルorder_idに on がなくても、どのレコードがどのレコードに関連付けられているかを判断するのに十分スマートです。Cart

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

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

Cartまた、単一のブラウザー セッションのコンテキストでのみ意味があるため、データベースに永続化する必要はおそらくないことも指摘しておきたいと思います。代わりに、プレーンな古い Ruby オブジェクト (単なるクラスであり、 から継承していないActiveRecord::Base) として設計し、そのように設計をさらに簡素化することができます。

于 2014-05-22T21:59:54.943 に答える