如何将范围与Model方法结合使用?

时间:2011-01-04 08:32:25

标签: ruby-on-rails ruby named-scope

我目前正在研究一些范围过滤器,我想让它过滤一个方法(不知道如何命名)。我的代码:

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的列?

比约

2 个答案:

答案 0 :(得分:2)

您不能在:conditions内使用ruby方法。这不是一个独占范围的东西,它适用于所有ActiveRecord查询:

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

原因是ActiveRecord需要的是可以“翻译”到数据库字段中的东西。符号:price_with_discount无法转换为数据库。

此外,如果你在轨道3,you don't really need scopes any more。常规类方法也会这样做,并且编写起来更容易(没有lambdas)。

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

答案 1 :(得分:0)

您不能尝试对我们的Ruby方法执行SQL限制。避免使用它,如果您的价格折扣不是字符串

,我认为它是有效的
scope :by_price, lambda {|min,max|{ :conditions => { :price-discount => min.to_f..max.to_f }}}