2016-06-09 5 views
0

나는 각 사용자에 대한 항목과 주문이있는 상점을 짓고 있습니다. 지금은 각 주문을 current_user와 연결하려고합니다. 즉, 명령을 내리는 사람입니다. 모델을 연결하는 방법을 알았지 만 주문 작성시 모델을 주문하기 위해 user_id를 저장하는 내용을 알아낼 수 없습니다. 표준 Devise 엔진을 사용하고 있습니다. has_one :order어떻게 current_user와 주문을 연관시킬 수 있습니까?

이 내입니다 :

belongs_to :order_status 
    belongs_to :user 
    has_many :order_items 
    before_create :set_order_status 
    before_save :update_subtotal 

    def subtotal 
    order_items.collect { |oi| oi.valid? ? (oi.quantity * oi.unit_price) : 0 }.sum 
    end 
private 
    def set_order_status 
    self.order_status_id = 1 
    end 

    def update_subtotal 
    self[:subtotal] = subtotal 
    end 
end 

order_item.rb

class OrderItem < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :order 

    validates :quantity, presence: true, numericality: { only_integer: true, greater_than: 0 } 
    validate :product_present 
    validate :order_present 

    before_save :finalize 

    def unit_price 
    if persisted? 
     self[:unit_price] 
    else 
     product.price 
    end 
    end 

    def total_price 
    unit_price * quantity 
    end 

private 
    def product_present 
    if product.nil? 
     errors.add(:product, "is not valid or is not active.") 
    end 
    end 

    def order_present 
    if order.nil? 
     errors.add(:order, "is not a valid order.") 
    end 
    end 

    def finalize 
    self[:unit_price] = unit_price 
    self[:total_price] = quantity * self[:unit_price] 
    end 
end 

그리고 user.rb에 내가 가진 Order.rb

:

내 모델입니다 OrderItemsController :

class OrderItemsController < ApplicationController 
    def create 
    @order = current_order 
    @order_item = @order.order_items.new(order_item_params) 
    @order.save 
    session[:order_id] = @order.id 
    end 

    def update 
    @order = current_order 
    @order_item = @order.order_items.find(params[:id]) 
    @order_item.update_attributes(order_item_params) 
    @order_items = @order.order_items 
    end 

    def destroy 
    @order = current_order 
    @order_item = @order.order_items.find(params[:id]) 
    @order_item.destroy 
    @order_items = @order.order_items 
    end 
private 
    def order_item_params 
    params.require(:order_item).permit(:quantity, :product_id) 
    end 
end 

답변

1

커플 방법 주문한 사용자. 사용자는 많은 주문을 받아야합니다. 먼저 주문 테이블에 user_id 열을 추가하기 위해 이전을 작성 했습니까? 참조로 생성 : rails g migration AddUserToOrder user:references

허용되는 매개 변수를 업데이트하여 user_id을 허용하십시오.

거기에서 몇 가지 일을 할 수있는 옵션이 있습니다 ... 저장하기 전에 주문 컨트롤러의 작성 작업에 user_id을 설정할 수 있습니다. (관련이 있지만 귀하의 Q - order_item에 대한 order_id가 필요 할거야, 안 그래?) 또는 숨겨진 필드를 통해 양식의 user_id를 전달할 수 있습니다.

둘 중 누구와도 연결할 예정입니다.

+0

좋아요. 매개 변수를 허용했지만 user_id를 설정하기위한 작업을 만들 때 정확히 무엇을 써야합니까? 이미 @ action_item = @ order.order_items.new (order_item_params)를 만들기 때문에 params를 쓰고있어 혼란 스럽습니다. –

+0

order_items 또는 order_items에 저장하려고합니까? – toddmetheny

+0

예 주문시에 저장하고 싶습니다 ... –

0

그냥 이런 식으로 할당 할 수 있습니다 :

current_user.order = @order 
current_user.save 

당신이 선 아래로 주문을 has_many 할 수있는 사용자를 원하는 경우는 다음과 같습니다 연결하는 방법에 대한 갈

current_user.orders << @order