2013-02-06 56 views
0

我想在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

回答

3

我不有經驗與Mongoid,所以答案可能不完全正確,但對我來說,似乎你正在混合兩件事:數據庫查詢,並在實例上調用方法。

他們是兩個單獨的東西,不能混合。例如:

def expensive? 
    price >= 10 
end 

...不是數據庫查詢方法。您只是查看實例變量並檢查它是否大於等於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

相關問題