2014-05-22 5 views
0

먼저 카트를 세션에 저장했습니다. 카트에는 품목 (제품)이 들어 있습니다. 체크 아웃 버튼은 새로운 주문 (cart has_one order, 주문 own_to cart)에 cart_id가 전달 된 Order.new 폼으로 연결됩니다.after_create를 사용하여 카트의 order_id 업데이트

바라건대 지금까지 그렇게 좋았습니다.

장바구니 매개 변수에는 사용자가 결제 버튼을 누를 때까지 처음에는 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뿐만 아니라 cart_wid_id에 액세스하는 것이 좋습니다.

모두 감사합니다, 팻

답변

2

당신은 두 방향으로 ORDER_ID를 저장하는 데 필요하지 않습니다이 디자인으로 해결하기 위해 희망하고보다 사실에 당신은 아마 더 많은 문제를 만들 수 있습니다. 예를 들어, 주문의 카트가 바뀌거나 다른 방향으로 가면 양방향으로 최신 값을 유지해야합니다.

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

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

나는 또한 당신이 아마 필요하지 않는 것을 지적 할 :

레일 심지어 Cart 모델에 order_id없이 기록이있는 연관된 알아낼 스스로 똑똑 Cart을 데이터베이스에 저장하십시오. 이는 단일 브라우저 세션의 컨텍스트에서만 의미가 있기 때문입니다. 대신 평범한 오래된 Ruby 객체 (그냥 ActiveRecord::Base에서 상속받지 않는 클래스)로 디자인하고 그런 식으로 디자인을 단순화 할 수 있습니다.

+0

세션 중에 장바구니를 보관하지 않는 것에 대한 독서 자료가 있습니까? 나는 그것을 이렇게하도록 권고 한 튜토리얼을 따랐다. – Peege151

+0

아프지 않겠지 만 데이터베이스에이 정보를 저장하면 어떤 이점이 있다고 생각합니까? 물론 최종 주문을 데이터베이스에 저장할 수 있습니다. 하지만 카트? 그 유일한 목적은 실제 명령이 내려지면 쓸모 없게되는 궁극적 인 목표를 가진 "초안 주문"입니다. 장바구니가 본질적으로 세션의 존재에 묶여 있다는 사실과 함께, 나는 데이터베이스에 그것을 지속하는 것이 실제로 필요하지 않다고 생각합니다. 결국 그것은 내 개인적인 의견 일뿐입니다. 이점은 쿼리가 적고 쓸데없는 데이터가 적습니다 (주문이 일단 카트를 복제하면) –

+0

주석이 너무 길어졌습니다. 또 다른 이점 : 지속성을 처리 할 필요가 없기 때문에 코드가 간단합니다. 아마 더 많은 이점을 생각할 수 있습니다 :-) 그러나, 당신이 튜토리얼을하고 있다면 당신은 그들이 말하는 것을 고집해야합니다. 기회는 튜토리얼 이이 모델을 구축 계속됩니다. –