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