2012-11-11 22 views
1

我有我的Business類中的以下方法:擷取模式類似於 - 的Rails

def similar_businesses(n) 
    Business.where(:category_id => category_id, :city_id => city_id).where("id NOT IN (?)",id).limit(n).order("RANDOM()") 
end 

它基本上抓住n企業,在同一個類別,同一個城市。

我一直在尋找,討論關於使用類的方法,而不是一個範圍railscast,並試圖以我的代碼轉換成:

def similar_businesses(n) 
    where(:category_id => category_id, :city_id => city_id).where("id NOT IN (?)",id).limit(n).order("RANDOM()") 
end 

通知Business是不存在了。

不過,我得到一個錯誤undefined where method for ...

我剛開始的軌道,而我也想知道是否有這兩種方法有什麼區別?爲什麼我得到這個錯誤?

回答

1

好像你要使用similar_businesses作爲方法,而不是實例方法。兩者之間的區別在於,您爲諸如Business之類的類播放類方法,並且您應用了諸如@business = Business.new之類的實例方法。

嘗試使用

def self.similar_businesses(n) 
    where(:category_id => category_id, :city_id => city_id).where("id NOT IN (?)",id).limit(n).order("RANDOM()") 
end 
+0

好吧我明白了。會比另一個更有效率嗎? – AlexBrand

+0

在上述情況下,效率沒有差別,因爲您基本上以同樣的方式做同樣的事情。 –

1

您需要將方法定義爲def self.similar_businesses以使其成爲類方法。

+0

我改變,現在我得到'未定義的方法 'similar_businesses' 爲#<業務:0x007fb4e2497458>'。我如何從實例中調用類方法? – AlexBrand

+1

你不能(你可以通過從實例中獲取類並調用它,但不需要)。就像這樣調用它:'Business.similar_businesses'。 – Russell