2011-12-04 56 views
1

我在其中一個模型中創建了一個相當簡單的新方法。然而,當我去鐵軌控制檯來測試它,我得到以下錯誤:如何獲得新創建的方法以在滑軌控制檯中工作

NoMethodError: undefined method 'get' for #<Class:0x3a5032fc> 

我已保存代碼,關閉軌道控制檯,然後重新啓動,但我仍然得到NoM​​ethod

class Race <ActiveRecord::Base 
    def get(race_date,track_name,race_number) 
    Race.where(:date =>race_date, :race_nbr => race_number, :track_id => (Track.where(:track_code => track_name))) 
    end 
end 

在控制檯中,我輸入以下內容:

Race.get("2011-12-04", "BEL", 1) 

其產生NoMethodError:undefined method 'get'

任何想法將不勝感激。

回答

7

您定義了類Race的實例方法。也許你會定義一個類的方法,如:

def self.get(race_date, track_name, race_number) 
    track = Track.where(:track_code => track_name) 
    Race.where(:date => race_date, :race_nbr => race_number, :track_id => track) 
end 

然後你可以使用Race.get

+1

很好的答案,+1 – apneadiving

+2

我會將'track'分隔成一個局部變量,只是爲了縮短這一行。但除此之外,很好的答案。 –

+0

瑞恩 - 你究竟是什麼意思將軌道分解爲局部變量。你能否給我一個你的意思的例子。 – Mutuelinvestor

4

@lucapette說得對;你需要創建一個類方法。以下是您可以定義類方法的另一種方法。在你定義大量類方法的大型項目中,它可能是組織代碼的一種更簡潔的方式,但是這種觀點純粹是主觀的。內class << self定義

class << self 
    def get(race_date,track_name,race_number) 
    Race.where(:date => race_date, 
       :race_nbr => race_number, 
       :track_id => (Track.where(:track_code => track_name))) 
    end 
end 

一切都變得一個類的方法。

另一種選擇是使用範圍。

scope :get, 
     lambda { |race_date, track_name, race_number| 
       Race.where(:date => race_date, 
          :race_nbr => race_number, 
          :track_id => (Track.where(:track_code => track_name))) } 

這最後的解決方案看起來的範圍有點笨重,所以它可能是最好在這種情況下,而不是一個範圍,使用一個類的方法。另外,我更喜歡具有描述性名稱的範圍,但我想這也適用於方法名稱。

+0

漂亮的插件,+1 – apneadiving

4

兩個偉大的答案後,我覺得自己像別的東西應該說:

如果控制檯已經推出,也不會想你已經添加了一些代碼,所以你必須重新加載。

喲爲此,只需輸入:

reload! 
在控制檯

(=不需要CTRL-C)。

+0

這是一個很好的觀點。如果您在控制檯之外編輯,這是必須的。我不知道我是如何錯過的。 +1 –

相關問題