Rails sql查询与动态属性

时间:2013-12-05 12:07:49

标签: ruby-on-rails rails-activerecord

假设我有一个ActiveRecord对象,其中包含存储在数据库中的quantityprice

我已经为total_price定义了一个访问者:

def total_price
 quantity * price
end

现在,如果我想在多个ActiveRecord查询上下文中使用此动态“属性”,该怎么办?我可以总结一下,计算平均值,多范围等等。

什么是最佳做法,以便我不必使用quantity * price重复此ActiveRecord,如果我不想通过在DB中写入来反规范化?

谢谢!

2 个答案:

答案 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")和什么不是。