2016-04-18 12 views
0

Ich fange an, eine Anwendung zu erstellen, die Produkte, einen Einkaufswagen und Zahlungen enthält. Sie beginnen mit dem Hinzufügen des Produkts zu Ihrem Warenkorb, indem Sie zu/products gehen. Wenn Sie dann zu/cart navigieren, füllt das System Ihre Liste der Produkte aus, die zur Kasse bereit sind. Es ist geplant, das Attribut "Gesamtpreis" innerhalb der Warenkorb-Tabelle in die Zahlungstabelle zu verknüpfen.Verbinden eines Einkaufswagen-Attributs "Gesamtpreis" mit einer Zahlungskonfiguration

Wie gehe ich vor, um zwei Attribute aus separaten Tabellen zu verknüpfen, um sie gleich zu machen? Ich habe die zwei Attribute markiert, die gleich sein müssen, "Gesamtpreis" und "Betrag".

create_payments.rb

class CreatePayments < ActiveRecord::Migration 
def change 
    create_table :payments do |t| 
    t.string :first_name 
    t.string :last_name 
    t.string :last4 
    ***t.decimal :amount, precision: 12, scale: 3*** 
    t.boolean :success 
    t.string :authorization_code 

    t.timestamps null: false 
    end 
    end 
end 

create_order_items.rb

class CreateOrderItems < ActiveRecord::Migration 
def change 
    create_table :order_items do |t| 
    t.references :product, index: true, foreign_key: true 
    t.references :order, index: true, foreign_key: true 
    t.decimal :unit_price, precision: 12, scale: 3 
    t.integer :quantity 
    ***t.decimal :total_price, precision: 12, scale: 3*** 

    t.timestamps null: false 
    end 
    end 
end 

Bitte lassen Sie mich wissen, ob noch weitere Dateien benötigt werden, um das Problem zu beheben. Vielen Dank im Voraus für jede Art von Hilfe!

+0

was genau meinst du damit? – Minato

+0

Ich möchte grundsätzlich das Attribut "Betrag" aus der Zahlungstabelle durch das Attribut "total_price" aus der Tabelle order_items ersetzen. Wenn ein Nutzer eine Zahlung tätigt, füllt er den geschuldeten Betrag basierend auf dem gekauften Produkt aus. – nomad

+0

Ich denke, Sie müssen einen "gehört" Bezug auf Ihre "Bestellung" innerhalb Ihrer "Zahlungen" und eine "has_one" innerhalb Ihrer Zahlung haben. Auf diese Weise können Sie einfach den Preis aller 'OrderItems 'abfragen und das' quantity' Attribut wie folgt auffüllen. 'payment.amount = payment.order.order_items.select (" total_price "). reduce (&: +)' – Minato

Antwort

0

Ich denke, was Sie hier suchen, ist eine benutzerdefinierte "Getter" -Methode zu schreiben, d.h. ein virtuelles Attribut. Sie könnten auch save überschreiben oder einen (Active Rückruf) verwenden [http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html]

Zum Beispiel:

class Payment < ActiveRecord::Base 
    has_many :order_items 

    # -------- 
    # option 1 
    # -------- 

    def amount 
    # sums up the total price of the associated order items 
    self.order_items.pluck(:price).sum 
    end 

    # -------- 
    # option 2 
    # -------- 

    def save(*args) 
    self.amount = self.order_items.pluck(:price).sum 
    super(*args) 
    end 

    # ---------- 
    # option 3 
    # ---------- 

    before_save :set_amount 
    def set_amount 
    self.amount = self.order_items.pluck(:price).sum 
    end 

end 

mit der ersten Option („custom Getter“) die Gesamt Spalte wird in der Datenbank gespeichert und ist Wird bei jedem Zugriff auf den Wert dynamisch neu berechnet.

Mit der zweiten Option („zwingenden speichern“), werden die amount Spalt automatisch eingestellt werden, wenn save auf einem Datensatz aufgerufen wird.

Die dritte Option ist wahrscheinlich die beste meiner Meinung nach. Es macht im Grunde dasselbe wie Option 2, sieht aber etwas sauberer aus.