概要
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
モデルを更新する時にもバリデーションエラーになってしまいます。