2016-04-18 68 views
0

我開始將包含產品,購物車和付款的應用程序放在一起。您首先將產品添加到購物車,然後轉到/ products。然後,如果您導航到購物車,系統將填充您準​​備結帳的產品清單。計劃是將購物車表中的「總價」屬性鏈接到付款表中。將購物車「總價」屬性連接到付款配置

如何從單獨的表中鏈接兩個屬性使它們相同?我已經標出了兩個需要相同的屬性,即「總價」和「金額」。

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 

請讓我知道,如果將需要進一步的文件,以幫助解決問題。提前感謝您提供任何形式的幫助!

+0

你到底意味着什麼? – Minato

+0

我基本上想用orders_items表中的「total_price」屬性替換payments表中的「amount」屬性。因此,當用戶進行付款時,它會根據購買的產品填充所欠的金額。 – nomad

+0

我認爲您需要在您的付款內有'payments'和'has_one'內的'orders'的'belongs_to'引用。這樣,您可以簡單地獲取所有'OrderItems'的價格並填充'amount'屬性。 'payment.amount = payment.order.order_items.select(「total_price」)。reduce(&:+)' – Minato

回答

0

我認爲你在這裏尋找的是寫一個自定義的「getter」方法,即一個虛擬屬性。你也可以覆蓋save或使用(ActiveRecord的回調)http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html]

例如:

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 

與第一選項(「自吸氣」),總列不存儲在數據庫中,並每次訪問該值時都會動態重新計算。

在第二個選項(「覆蓋保存」)下,只要在記錄上調用save,就會自動設置amount列。

第三個選項可能是我認爲最好的。它基本上和選項2一樣,但看起來更乾淨。