ActiveRecord - 从关联中预取单个记录

时间:2010-10-26 17:10:42

标签: mysql ruby-on-rails sqlite activerecord

考虑以下模型..

class Product < ActiveRecord::Base
  has_many    :pricings
end

class Pricing < ActiveRecord::Base
  belongs_to  :server
end

定价是产品价格的历史跟踪表,因此随着时间的推移可能会捕获数百个价格点。我想添加的是一种只获得产品当前价格的方法。

虽然我可以像下面那样为模型添加has_one关系:

has_one  :current_pricing, :class_name => "Pricing", :foreign_key => "product_id",
         :order => 'created_at DESC'

这将取回当前产品的所有Pricings,然后返回第一条记录。

我正在寻找一种以更有效的方式实现这一目标的方法,并希望有人能够做出类似的投入或以前的经验。

3 个答案:

答案 0 :(得分:2)

您可以使用命名范围。把它放在定价模型的顶部:

class Pricing < ActiveRecord::Base
  named_scope :current, lambda { |product| { :conditions => { :product_id => product.id }, :order => 'created_at DESC', :limit => 1 } }
end

然后,要获得产品的当前定价,您可以调用“Pricing.current(product).first”。

除了定价范围之外,您还可以向Product模型添加一个存取方法,如下所示:

class Product < ActiveRecord::Base
  def current_pricing
    Pricing.current(self).first
  end
end

答案 1 :(得分:1)

你正在寻找一个named_scope。在你的定价模型中定义它。用1参数product_id供给它。

named_scope :latest_price, lambda { |*args| {:conditions => {:product_id => args.first}, :order => "created_at DESC", :limit => 1} }

顺便提一下screencast

答案 2 :(得分:0)

为查询添加:限制?