Rails custom validation - может быть только одна запись

Я пытаюсь написать проверку, где может быть только одна запись. У меня есть "игровая" модель с "активным" булевым столбцом, только одна игра может быть активной в любое время, поэтому, если кто-то пытается создать новую запись "игры", когда есть уже активная игра, тогда они должны получить ошибку, Ниже приведено то, что у меня есть, но не работает!

validate :active_game

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

Ответы

Ответ 1

Вам также необходимо проверить идентификатор, если запись уже сохранена. В противном случае сохранение активной игры еще не получится, потому что есть существующая активная игра, которая сама по себе.

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

Я думаю, вы можете просто проверить уникальность active_game, когда это правда.

validates_uniqueness_of :active_game, if: :active_game

Ответ 3

Попробуйте использовать метод 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