Boolean型のカラムがテーブル内で2つ以上trueにならないようにするバリデーションの実装方法
概要
Railsで、enabledカラムがtrueのデータがテーブル内で1つだけという状況を担保したい状況があると思います。そういう時に実装するバリデーションについて書きます。
実装
class Hoge < ApplicationRecord validate :enabled_hoge_uniqueness private def enabled_hoge_uniqueness errors.add(:base, '既に有効なHogeが存在します。') if enabled? && self.class.where(enabled: true).where.not(id:).exists? end end
解説
上記バリデーションを定義することで、Hogeモデルを保存する時にenabledがtrueの場合のみ、「他にenabledカラムがtrueのHogeが存在するかどうか」をチェックしてくれます。
また、.where.not(id:)を使用することで保存しようとしているHogeモデル自身を検索対象から除外できます。これをしないと、元々enabledカラムがtrueのHogeモデルを更新する時にもバリデーションエラーになってしまいます。