我开始整理一个包含产品,购物车和付款的应用程序。首先,您可以转到/ products将产品添加到购物车。然后,如果您导航到/ cart,系统将填充准备结帐的产品列表。该计划将链接"总价格"将购物车表中的属性纳入付款表。
如何从单独的表中链接两个属性以使它们相同?我已经标记了两个需要相同的属性,"总价格"和"金额。"
create_payments.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
create_order_items.rb
events
如果有任何其他文件需要帮助解决问题,请告诉我们。提前感谢您提供任何类型的帮助!
答案 0 :(得分: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
使用第一个选项(“自定义getter”),聚合列不会存储在数据库中,并且每次访问它时都会动态重新计算。
使用第二个选项(“覆盖保存”),只要在记录上调用amount
,就会自动设置save
列。
在我看来,第三种选择可能是最好的。它基本上与选项2相同,但看起来更清洁。