たろすの技術メモ

Jot Down the Tech

ソフトウェアエンジニアのメモ書き

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モデルを保存する時にenabledtrueの場合のみ、「他にenabledカラムがtrueHogeが存在するかどうか」をチェックしてくれます。

また、.where.not(id:)を使用することで保存しようとしているHogeモデル自身を検索対象から除外できます。これをしないと、元々enabledカラムがtrueHogeモデルを更新する時にもバリデーションエラーになってしまいます。