Rails 3の検証および/またはコールバックを使用して、モデルのレコードの1つだけがブール値が真であることを確認する最もクリーンな方法はありますか? 1つのレコードを現在アクティブなモデルとしてマークしたいと思います。Rails検証を使用して現在アクティブなモデルを1つに制限する
(私は別のオプションがあり-1の関連付けを使用することです知っているが、私はモデルのレコードによりこれを直接保存する方法を知って興味があります。)
Rails 3の検証および/またはコールバックを使用して、モデルのレコードの1つだけがブール値が真であることを確認する最もクリーンな方法はありますか? 1つのレコードを現在アクティブなモデルとしてマークしたいと思います。Rails検証を使用して現在アクティブなモデルを1つに制限する
(私は別のオプションがあり-1の関連付けを使用することです知っているが、私はモデルのレコードによりこれを直接保存する方法を知って興味があります。)
すべてはあなたがしたい場合はあなたが使用できることを確認しています
validates_uniqueness_of :boolean_attribute, if: :boolean_attribute
ちょうどそれをモデルクラスにドロップしてください。これにより、モデルにはtrueに設定されたboolean_attributeが1つだけ存在することが検証されます。
boolean_attributeを1つのインスタンスから別のインスタンスにスワップすることの原則を回避する必要があることに注意してください。
使用しているデータベースによっては、トランザクションを使用して解決できる可能性があります。データベースがトランザクションをサポートしていない場合は、データの一貫性を保証するためのより良い方法(「アクティブ」モデルを指す専用モデルを使用し、boolean_attribute
を完全に削除するか、boolean_attribute
を整数に置き換えるなど)アトミックにインクリメントされます(アクティブな番号を表す最も高い番号)
コールバックは、おそらく最良の方法だろう。ような何か:
before_create :check_boolean
def check_boolean
Model.find_by_boolean_value(true).nil? ? true : false
end
check_boolean falseを返す場合は、createアクションがキャンセルされた(代わりにあなたが使用することもできfind_byおそらく、もう少し明確にコーディングされている?が存在する)