Как использовать область в сочетании с методом Model? - PullRequest
0 голосов
/ 04 января 2011

В настоящее время я работаю над некоторыми фильтрами области видимости, и мне бы хотелось, чтобы он был отфильтрован по методу (иначе я не знаю, как его назвать).Мой код:

class Product < ActiveRecord::Base
  def price_with_discount
    price-discount.to_f
  end

  scope :by_price, lambda {|min,max|{ :conditions => { :price_with_discount => min.to_f..max.to_f }}}
end

Это не работает: «Нет атрибута с именем price_with_discount для таблицы products».Как я могу обмануть свою область применения метода, который я определил, вместо поиска столбца с именем price_with_discount?

Bjorn

Ответы [ 2 ]

2 голосов
/ 04 января 2011

Вы не можете использовать методы ruby ​​внутри :conditions. Это не исключительная область действия, она применяется во всех запросах ActiveRecord:

# This won't work either
Product.where(:price_with_discount => min.to_f)

Причина этого в том, что ActiveRecord нуждается в чем-то, что может быть «преобразовано» в поля базы данных. Символ :price_with_discount не может быть переведен в базу данных.

Кроме того, если вы находитесь на рельсах 3, вам больше не нужны рамки . Обычный метод класса будет делать то же самое, и его легче написать (без лямбд).

class Product < ActiveRecord::Base
  def self.by_price(min, max)
    # Assuming that products.discount is a database field:
    where([ "(products.price - products.discount) >= ? AND " +
            "(products.price - products.discount) <= ?",
            min, max
    ])
  end
end
0 голосов
/ 04 января 2011

Вы не можете попытаться установить ограничение SQL для нашего метода Ruby.Не используйте его, и я полагаю, что это работает, если ваша цена-скидка не является String

scope :by_price, lambda {|min,max|{ :conditions => { :price-discount => min.to_f..max.to_f }}}
...