ActiveRecord - предварительно извлекать отдельные записи из ассоциации - PullRequest
2 голосов
/ 26 октября 2010

Рассмотрим следующие модели.

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'

Это приведет к получениюМне все цены на текущий продукт, прежде чем вернуть мне только первую запись.

Я ищу способ сделать это более эффективным образом и надеялся, что кто-то получит свой вклад или предыдущий опыт, сделав что-то подобное.

Ответы [ 3 ]

2 голосов
/ 26 октября 2010

Вы можете использовать именованную область. Поместите это вверху модели ценообразования:

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».

В дополнение к названной области действия при ценообразовании вы можете добавить метод доступа к модели продукта, например:

class Product < ActiveRecord::Base
  def current_pricing
    Pricing.current(self).first
  end
end
1 голос
/ 26 октября 2010

Вы ищете named_scope. Определите это в своей модели ценообразования. Поставьте его с 1 параметром, product_id.

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

Отлично Screencast , кстати, по этому вопросу.

0 голосов
/ 26 октября 2010

Добавить: ограничение на запрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...