2016-12-01 47 views
1

我:动态产品价格在Rails的

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

听起来像一本书可以有很多价格,对不对? – Anthony

+0

你自己回答。您需要在销售时存储sale_price或book_price。 –

回答

1

如果您不关心本书的价格历史,您可以在Sale模型中添加sale_price模型,该模型将与创建销售时的图书价格相同。如果您决定补充一点,您可能需要考虑添加另一个栏目来指示销售价格,例如“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 
0

关系变化很多。

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

表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表book_sales,并对其进行更新的基础上book_id和通话功能总sale_id。

1

您可以将一列添加到名为book_pricesales表中。每次创建销售时,您都会将此时的图书价格保存到sales表中book_price列。

然后在你的Sale模型,你可以得到总:

def total 
    book_price * quantity.to_f 
end 

所以,如果你改变了一本书的价格,也不会在过去的销售影响。

+0

糟糕的解决方案:这种方式我们必须手动键入book_price,每次创建销售 –