2016-12-01 5 views
1

ich habe:dynamische Produktpreis 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 

Problem: Wenn ich will, den Preis ändern eines Buches wird es alle vergangenen Verkäufe neu berechnen.

Kann ich das vermeiden? Indem Sie den Preisverlauf eines Produkts irgendwie speichern oder einen aktuellen Preis haben (aktiver Preis)?

+0

klingt wie ein Buch kann viele Preise haben, richtig? – Anthony

+0

Sie haben sich selbst geantwortet. Sie müssen entweder sale_price oder book_price zum Zeitpunkt des Verkaufs speichern. –

Antwort

1

Wenn Sie sich nicht um die Preisentwicklung des Buches kümmern, können Sie einfach sale_price zum Sale Modell hinzufügen, das dem Buchpreis entspricht, als der Verkauf erstellt wurde. Wenn Sie sich entscheiden, das hinzuzufügen, sollten Sie in Erwägung ziehen, eine weitere Spalte hinzuzufügen, die etwas über den Verkaufspreis aussagen kann, z. B. "10% Rabatt" oder "schwarzer Freitag-Verkauf".

Gut, dass Sie den Buchsatz nicht mehr laden müssen, um den Gesamtpreis zu berechnen.

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 

In Ihrem Vertriebscontroller, können Sie so etwas wie den folgenden Code hinzufügen möchten, damit Sie den sale_price automatisch einstellen.

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

Wechsel in Beziehung viele-viele.

Buch hat viele Verkäufe und hat viele Bücher.

Tabelle book_sales

  • ID
  • book_id

book.rb

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

sale.rb

sale_id
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 

Oder Sie Feld total Tabelle book_sales hinzufügen können, und aktualisieren Sie es Basis auf book_id und Anruffunktion Gesamt sale_id.

1

Sie können der Tabelle sales eine Spalte mit dem Namen book_price hinzufügen. Jedes Mal, wenn ein Verkauf erstellt wird, speichern Sie den Buchpreis zu diesem Zeitpunkt in book_price Spalte in sales Tabelle.

Dann in Ihrem Sale Modell können Sie insgesamt von erhalten:

def total 
    book_price * quantity.to_f 
end 

Also, wenn Sie Preis eines Buches zu ändern, nicht auf vergangene Verkäufe auswirken.

+0

Schlechte Lösung: Auf diese Weise müssen wir den book_price jedes Mal, wenn ein Verkauf erstellt wird, manuell eingeben –

Verwandte Themen