如何在每个会话上保持相同的顺序?

时间:2016-06-28 13:00:07

标签: ruby-on-rails ruby

我在铁路上的商店工作。由于我是Rails的新手,我正在学习如何创建购物车和订购系统的一些教程。

所以现在,在每个新会话中添加order_item到购物车时,用户会自动创建并保存具有唯一ID的订单。这就是问题所在。

我希望订单持续到30天过去(首先创建的一个订单,即用户添加第一个order_item时)。接下来的问题是:因此,如果用户添加了order_items,他会创建一个订单然后退出并返回并向他的购物车添加新的order_item,即使已经将旧订单保存到数据库,也会创建新订单。我想要检索第一个订单。

你能告诉我如何实现这个目标吗?

perlocation.name

order_item.rb

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

  respond_to do |format|
    format.js { flash[:notice] = "ORDER ITEM HAS BEEN ADDED." } 
  end
  end

order.rb

class OrderItem < ActiveRecord::Base
  belongs_to :product
  belongs_to :order
  validates_associated :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

class Order < ActiveRecord::Base
  belongs_to :order_status
  belongs_to :user
  has_many :order_items
  validates_length_of :order_items, maximum: 3
  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

1 个答案:

答案 0 :(得分:2)

  

我想检索第一个订单。

这一行:

  

@order = current_order

current_order在哪里定义?您希望它找到现有订单(如果存在),而不是创建新订单。类似的东西:

 def current_order
    order = Order.find_by_user_id(current_user.id)
    if order.nil?
       order = Order.create (...etc)
    end
    order
 end