我目前正在研究一些范围过滤器,我想让它过滤一个方法(不知道如何命名)。我的代码:
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
的列?
比约
答案 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 }}}