2011-12-04 15 views
1

私のモデルではかなり簡単な新しいメソッドを作成しました。しかし、私はそれをテストするために、レールコンソールに行くとき、私は次のエラーを取得する:どのように新しく作成されたメソッドをレールコンソールで動作させるのですか

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

私は、コードを保存した、レールコンソールを閉じて、その後、再起動、私はまだNoMethod

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 
を取得コンソールで

、私は次のように入力します。NoMethodError:undefined method 'get'を生み出す

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

どのような考えにも感謝します。

答えて

7

レースクラスのインスタンスメソッドを定義しました。クラスメソッドを次のように定義したとします。Race.getを使用できます。

+1

素敵な答え、+1 – apneadiving

+2

私は 'track'をローカル変数に分けて、行をもっと短くしたいと思います。しかしそれに加えて、素晴らしい答え。 –

+0

Ryan - トラックをローカル変数に分けることは、正確に何を意味しますか。あなたが意味することの例を教えてください。 – Mutuelinvestor

4

@lucapetteは正しくなっています。クラスメソッドを作成する必要があります。以下は、クラスメソッドを定義する別の方法です。多数のクラスメソッドを定義している大規模なプロジェクトでは、コードを整理するためのよりクリーンな方法ですが、その意見は純粋に主観的なものです。

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 

class << selfに定義されているすべてがクラスメソッドになります。

もう1つのオプションは、スコープを使用することです。

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))) } 

この最後の解決策は、スコープとして少し扱いに​​くい見えますので、代わりにスコープのこのケースでは、クラスのメソッドを使用するのが最善です。また、わかりやすい名前のスコープも好きですが、メソッド名にも適用されると思います。 2つの偉大な答えの後

+0

すてきなアドオン、+1 – apneadiving

4

は、私が何か他のもののように感じる明記する必要があります。

コンソールがすでに開始された場合は、リロードする必要がありますので、それはあなたには、いくつかのコードを追加した推測ではないでしょう。

ヨこれを行う、単純に入力します。コンソールで

reload! 

を(= CTRL-Cへの必要はありません)。

+0

それは大きなポイントです。コンソールの外で編集している場合、これは必須です。どのように私はそれを逃したのか分からない。 +1 –

関連する問題