2012-02-01 5 views
2

私の検証で私の関連で生成されたメソッドを呼び出す際に問題があります。関連付けメソッドを検証から呼び出すことができません

私のコードは非常に単純です:

class Match < ActiveRecord::Base 
    # Associations 
    belongs_to :tournament 

    has_many :match_player_relations 
    has_many :waiting_players, through: :match_player_relations 
    has_many :replays 

    # Validations 
    validates :tournament_id, presence: true 
    validates :winner_id, inclusion: { in: waiting_players.map { |wp| wp.id } } 
end 

私はwaiting_players方法があることを私のテストで検証している、それが正常に動作します。しかし、私の検証でそれを呼び出そうとすると、次のエラーが発生します。

/Users/max/.rvm/gems/ruby-1.9.3-p0/gems/activerecord-3.1.3/lib/active_record/base.rb:1088:in `method_missing': undefined local variable or method `waiting_players' for #<Class:0x007fc3b498c9c8> (NameError) 
    from /Users/max/workplace/CloudLeagues/app/models/match.rb:11:in `<class:Match>' 

これを解決する方法はありますか?または、検証を削除する必要がありますか?

+0

をそれがself.waiting_players' 'で動作しますか? – Baldrick

+0

いいえ、私は同じエラーが発生します。 – Max

+0

この質問を見るのは不可能かもしれません:http://stackoverflow.com/questions/5034988/rails-3-validates-inclusion-of-when-using-a-find-how-to-proc-or-ラムダ – Baldrick

答えて

3

あなたが現在のレコードにアクセスするためにinにラムダを渡す必要がありますかなり確信:

validates :winner_id, inclusion: { 
    in: lambda {|match| match.waiting_players.map { |wp| wp.id }} 
} 
+0

これはほぼ正しい答えです。これは、winner_idが待機中のプレーヤーであることを確認します。ただし、winner_idが存在しない場合、検証に失敗するという警告があります。単に 'presence:false'を追加してもこれは修正されません。この問題の解決法はありますか? – Max

+0

ありがとう、私はそれを考え出した。私がする必要があったのは、::winner_idをインクルードハッシュの後に追加することでした。 – Max

関連する問題