假设我有一个ActiveRecord
对象,其中包含存储在数据库中的quantity
和price
。
我已经为total_price定义了一个访问者:
def total_price
quantity * price
end
现在,如果我想在多个ActiveRecord
查询上下文中使用此动态“属性”,该怎么办?我可以总结一下,计算平均值,多范围等等。
什么是最佳做法,以便我不必使用quantity * price
重复此ActiveRecord
,如果我不想通过在DB中写入来反规范化?
谢谢!
答案 0 :(得分:2)
我们想让caption
(来自加入模型)出现在我们关联的image
模型上(IE如果您调用了@user.images
,则可以调用{{1} (即使标题在连接模型中)
所以我们查看this RailsCast(您将从6:40左右受益),它为我们提供了一些有关如何使用image.caption
创建更多动态查询的信息。我们最终使用了这个:
join
我在想你可以为你的请求使用类似的东西(包括一些SQL来在对象中创建伪列)。由于它是原型,我正在考虑这样的范围:
has_many :images, -> { select("#{Image.table_name}.*, #{ImageMessage.table_name}.caption AS caption") }
答案 1 :(得分:-1)
我假设价格存储在数据库中。数量是否存储在数据库中?如果两者都存储,为什么不将total_price
作为数据库列呢?每当您更新记录时,您都可以更新total_price
。
class Order < AR::Base
before_update :update_total_price
def update_total_price
self[:total_price] = quantity * price
end
end
显然,您可以使用普通列做任何事情,例如Order.where("total_price > 1.0")
和什么不是。