【问题标题】:How associate order with a current_user?如何将订单与 current_user 关联?
【发布时间】:2016-10-10 01:53:27
【问题描述】:

我正在建立一个商店,为每个用户提供商品和订单。 现在我想将每个订单与 current_user 相关联。也就是说,正在下订单的那个。 我想出了如何关联模型,但我不知道要在创建订单时将 user_id 保存到订单模型中的内容。我正在使用标准的设计引擎。

这些是我的模型:

订单.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

【问题讨论】:

    标签: ruby-on-rails ruby model-view-controller shopping-cart


    【解决方案1】:

    将用户与订单相关联的几种方法。一个用户应该有很多订单。首先,您是否编写了迁移以将 user_id 列添加到您的订单表?通过引用创建一个:rails g migration AddUserToOrder user:references

    然后更新您允许的参数以允许user_id

    从那里您可以选择做一些事情...您可以在保存之前在订单控制器的创建操作中设置user_id。 (相关但与您的 Q 无关——您将需要一个 order_id 作为 order_item,不是吗?)或者,您可以通过隐藏字段在表单中传递 user_id。

    其中任何一个都会为您关联它。

    【讨论】:

    • 好的,我允许了这些参数,但是我应该在创建操作中写什么来设置 user_id?因为我已经在创建操作中说明了参数:@order_item = @order.order_items.new(order_item_params) 所以它让我感到困惑..
    • 您是要保存在 order 中还是 order_items 中?
    • 你也有参考,对吧? user_id 出现在您的 schema.rb 文件中? @order.user_id = current_user.id 之前的 @order.save 应该照顾它。如果这样做不行...用堆栈跟踪中的参数哈希更新您的问题。
    • @MarkoI。没问题。接受答案?
    • @toddemetheny 刚刚做了 :)
    【解决方案2】:

    你可以像这样分配它:

    current_user.order = @order
    current_user.save
    

    如果您希望用户下线有_many 个订单,它会是:

    current_user.orders << @order
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 2020-07-31
      • 2014-04-06
      • 1970-01-01
      相关资源
      最近更新 更多