2016-06-09 54 views
0

我正在建立一個有每個用戶物品和訂單的商店。 現在我想將每個訂單與current_user相關聯。就是那個正在下訂單的人。 我想如何關聯模型,但我無法弄清楚在創建訂單時將user_id保存爲訂單模型的內容。我正在使用標準的Devise引擎。如何將訂單與current_user關聯?

這是我的模型:

Order.rb

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我:has_one :order

這是我的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_id作爲order_item,否?)或者,你可以通過隱藏字段在你的表單中傳遞user_id。

其中任何一個都會將它與您聯繫起來。

+0

好吧我允許的參數,但究竟應該寫在創建行動來設置user_id?因爲我已經在創建動作中聲明params:@order_item = @ order.order_items.new(order_item_params)所以它會讓我困惑。 –

+0

您是試圖將它保存在order或order_items上嗎? – toddmetheny

+0

是的,我想保存它在訂單... –

0

你可以只給它分配是這樣的:

current_user.order = @order 
current_user.save 

如果你希望用戶HAS_MANY訂單下了線,這將是:

current_user.orders << @order