如何将订单与current_user关联?

问题描述:

我正在建立一个有每个用户物品和订单的商店。 现在我想将每个订单与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 

夫妇方式去关联有订单的用户。用户应该有很多订单。首先,您是否写过一个迁移程序,将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

是的,我想保存它在订单... –

你可以只给它分配是这样的:

current_user.order = @order 
current_user.save 

如果你希望用户HAS_MANY订单下了线,这将是:

current_user.orders << @order