26

我正在尝试编写一个只有一条记录可以为真的验证。我有一个带有“活动”布尔列的“游戏”模型,任何时候都只能有一个游戏处于活动状态,所以如果有人在已经有一个活动的游戏时尝试创建一个新的“游戏”记录,那么他们应该得到一个错误. 以下是我目前拥有但无法正常工作的内容!

validate :active_game

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

3 回答 3

70

我认为您可以在 active_game 为真时检查其唯一性。

validates_uniqueness_of :active_game, if: :active_game

于 2014-07-24T08:31:33.773 回答
13

如果记录已被保留,您还需要检查 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
于 2013-10-24T20:09:51.000 回答
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
于 2013-10-24T20:00:25.510 回答