我有:
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(有效价格)?
答案 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
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更新它。