我想在Mongoid中定义2个方法:昂贵?以及它的范围。这就是我正在做的事情:
class MyItem
include Mongoid::Document
include Mongoid::Timestamps
# it could find expensive and cheap items depending of is_expensive parameter
scope :expensive, ->(is_expensive = true) do
if is_expensive
where(:expensive?)
else
not_in(:expensive?)
end
end
def expensive?
price >= 10 # $10
end
end
所以我希望能够通过以下方式找到项目:
MyItem.expensive #find all expensive ones
MyItem.where(:expensive?) #the same as above
MyItem.first.expensive? #check if it's expensive
items.expensive # items is the collection of MyItem
它们不起作用。例如,MyItem.where(:expensive?)
说undefined method each_pair for :expensive?:Symbol
特别是我想弄清楚如何使用实例方法(不是类方法)的方法或范围 - items.expensive
< / p>
答案 0 :(得分:3)
我没有Mongoid的经验,所以答案可能不完全正确,但对我来说,似乎你混合了两件事:数据库查询和实例上的调用方法。
它们是两个独立的东西,不能混合。例如:
def expensive?
price >= 10
end
...不是数据库查询方法。您只是查看一个实例变量并检查它是否为&gt; = 10.因此,您不能在数据库查询中使用此方法,因为它不是查询构造。
但要使其发挥作用不应该太难。你需要改变的是:
scope :expensive ... do
is_expensive ? where(:price.gte => 10) : where(:price.lt => 10)
end
where
的参数必须始终为Mongoid query expression。它不可能是其他东西。
现在您的设置应该可行。您可以询问所需的一切:
MyItem.expensive # Returns a collection of expensive items
MyItem.first.expensive? # Calls the instance method. Returns true or false
items.expensive # Returns all expensive items in the collection
但是这不起作用:
MyItem.where(:expensive?)
因为:expensive?
不是有效的查询表达式,这是where
的参数始终需要的。