如何将订单与 current_user 相关联?
How associate order with a current_user?
我正在建立一个商店,为每个用户提供商品和订单。
现在我想将每个订单与 current_user 相关联。也就是说,正在下订单的那个。
我想出了如何关联模型,但我不知道该写什么可以在创建订单时将 user_id 保存到订单模型。我正在使用标准的 Devise 引擎。
这些是我的模型:
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
你可以这样赋值:
current_user.order = @order
current_user.save
如果您希望用户在线下has_many 订单,则为:
current_user.orders << @order
将用户与订单相关联的几种方法。一个用户应该有很多订单。首先,您是否编写了一个迁移以将 user_id
列添加到您的订单 table?通过引用创建一个:rails g migration AddUserToOrder user:references
然后更新您允许的参数以允许user_id
。
从那里您可以选择做一些事情...您可以在保存之前在订单控制器的创建操作中设置 user_id
。 (相关但不是你的问题——你需要一个 order_id 来表示一个 order_item,不是吗?)或者,你可以通过一个隐藏字段在你的表单中传递 user_id。
其中任何一个都会为您联想到它。
我正在建立一个商店,为每个用户提供商品和订单。 现在我想将每个订单与 current_user 相关联。也就是说,正在下订单的那个。 我想出了如何关联模型,但我不知道该写什么可以在创建订单时将 user_id 保存到订单模型。我正在使用标准的 Devise 引擎。
这些是我的模型:
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
你可以这样赋值:
current_user.order = @order
current_user.save
如果您希望用户在线下has_many 订单,则为:
current_user.orders << @order
将用户与订单相关联的几种方法。一个用户应该有很多订单。首先,您是否编写了一个迁移以将 user_id
列添加到您的订单 table?通过引用创建一个:rails g migration AddUserToOrder user:references
然后更新您允许的参数以允许user_id
。
从那里您可以选择做一些事情...您可以在保存之前在订单控制器的创建操作中设置 user_id
。 (相关但不是你的问题——你需要一个 order_id 来表示一个 order_item,不是吗?)或者,你可以通过一个隐藏字段在你的表单中传递 user_id。
其中任何一个都会为您联想到它。