Rails自定义验证 - 只有一条记录可以为真

时间:2013-10-24 19:54:02

标签: ruby-on-rails ruby validation activerecord ruby-on-rails-4

我正在尝试编写验证,其中只有一条记录可以为真。 我有一个带有'主动'布尔列的“游戏”模型,任何时候只有一个游戏可以激活,所以如果有人试图在已经有效的游戏中创建新的“游戏”记录,那么他们应该会收到错误。以下是我目前的工作但不起作用!

validate :active_game

  def active_game
    if active == true && Game.find_by(active: true) == true
       errors[:name] = "a game is already active!"
    end
  end

3 个答案:

答案 0 :(得分:51)

我认为你可以检查active_game的唯一性。

validates_uniqueness_of :active_game, if: :active_game

答案 1 :(得分:10)

如果记录已经保留,您还需要检查ID。否则,再次保存活动游戏将不会成功,因为存在一个现有的活动游戏,恰好是它本身。

validate :only_one_active_game
scope :active, where(:active => true)

protected

def only_one_active_game
  return unless active?

  matches = Game.active
  if persisted?
    matches = matches.where('id != ?', id)
  end
  if matches.exists?
    errors.add(:active, 'cannot have another active game')
  end
end

答案 2 :(得分:0)

尝试使用exists?方法。另外,使用add方法添加错误。

validate :active_game
scope :active, where(active: true)

  def active_game
    if active && Game.active.where("id != ?", id).exists?
       errors.add(:name, "a game is already active!")
    end
  end