2016-04-18 18 views
0

私は、商品、ショッピングカート、支払いを含むアプリケーションをまとめています。あなたは/ productsに行くことでカートに商品を追加することから始めます。次に/ cartに移動すると、システムはチェックアウトの準備が整った商品のリストを入力します。計画は、カートテーブル内の「合計価格」属性を支払いテーブルにリンクすることです。ショッピングカートの「合計価格」属性を支払い設定に接続

別のテーブルの2つの属性をリンクして同じにするにはどうすればよいですか?私は同じことが必要な2つの属性、「総価格」と「金額」をマークしました。

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

私は基本的に、paymentテーブルの "amount"属性をorder_itemsテーブルの "total_price"属性に置き換えたいと思っています。したがって、ユーザーが支払いを行うと、購入した製品に基づいて支払う金額が入力されます。 – nomad

+0

お支払いの中に 'payments'の中の' Order'と 'has_one'を参照する' belongs_to'参照が必要だと思います。そうすれば、単に 'OrderItems'のすべての価格を取得し、' amount'属性のように設定することができます。 'payment.amount = payment.order.order_items.select(" total_price ")。reduce(&:+)' – Minato

答えて

0

ここで探しているのは、カスタムの「ゲッター」メソッド、つまり仮想属性を記述することです。あなたも例えば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 

最初のオプション(「カスタムゲッター」)と、集計列がデータベースに格納されていないとされ値がアクセスされるたびに動的に再計算されます。

2番目のオプション(「オーバーライド保存」)では、saveがレコードで呼び出されると、amount列が自動的に設定されます。

第3の選択肢はおそらく私の意見では最高です。それは基本的にオプション2と同じことをしますが、少しきれいに見えます。