Rails中的动态产品价格

时间:2016-12-01 00:30:25

标签: ruby-on-rails ruby

我有:

scaffold Book name price:integer
scaffold Sale book:referenes quantity:integer

Book.rb

has_many :sales

Sale.rb:

belongs_to :book

def total
  book.price * quantity.to_f
end

问题:如果我想更改图书的价格,它会重新计算过去的所有销售额。

我可以避免这个吗?通过某种方式保存产品的定价历史或具有current_price(有效价格)?

3 个答案:

答案 0 :(得分:2)

如果您不关心图书的价格历史记录,只需在sale_price模型中添加一个Sale,该版本将等于销售时的图书价格创建了。如果您决定添加它,您可能需要考虑添加另一个可以指示销售价格的列,即" 10%折扣"或"黑色星期五销售"。

这样做的好处是,您不再需要加载图书记录来计算总价格。

bin/rails g migration add_sale_price_to_sales
bin/rake db:migrate

# app/model/sale.rb
def total
  sale_price.to_f * quantity.to_d
end

在您的销售控制器中,您可能希望添加类似以下代码的内容,以便您可以自动设置sale_price

def create
  @sale = Sale.new(sale_params)
  @sale.sale_price = @sale.book && @sale.book.price

  if @sale.save
    redirect_to @sale
  else
    render :new
  end
end

答案 1 :(得分:1)

您可以向名为sales的{​​{1}}表添加一列。每次创建促销时,您都会将当时的图书价格保存到book_price表格中的book_price列。

然后在您的sales模型中,您可以获得总数:

Sale

因此,如果您更改图书的价格,则不会影响过去的销售。

答案 2 :(得分:0)

改变许多人的关系。

书中有很多销售和销售有很多书。

table book_sales

  • ID
  • book_id
  • sale_id

book.rb

has_many :book_sales, dependent: :destroy
has_many :sales, through: :book_sales

sale.rb

has_many :book_sales, dependent: :destroy
has_many :books, through: :book_sales

book_sale.rb

belongs_to :article
belongs_to :tag

def total
  self.book.price * self.sale.quantity.to_f
end

或者您可以将字段total添加到table book_sales,并根据book_id和sale_id通过调用函数total更新它。