【问题标题】:Cannot call association methods from validations无法从验证中调用关联方法
【发布时间】:2012-02-01 19:34:15
【问题描述】:

在我的验证中调用我的关联生成的方法时遇到问题。

我的代码很简单:

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>'

有没有办法解决这个问题?还是我需要删除验证?

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

很确定您需要将 lambda 传递给 in 以访问当前记录:

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

【讨论】:

  • 这几乎是正确的答案。这确实验证了winner_id 是等待玩家。但是,需要注意的是,如果没有 winner_id,验证将失败。简单地添加presence: false 并不能解决这个问题。这个问题有解决办法吗?
  • 谢谢,我想通了。我需要做的就是在包含哈希之后添加 if: :winner_id。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多