Techioz Blog

Rails: 一度に 1 つのブール値フィールドのみが true に設定されるようにする

概要

name:string、default:boolean のフィールドを持つモデルがあります。一度にデータベース内の 1 つの項目のみを true に設定できるように、true 値を一意にする必要があります。項目の残りの値をすべて false に設定するには、コントローラーで更新および新しいアクションを設定するにはどうすればよいですか?

データベースに次の設定があるとします。

name:string | default:boolean |  
Item1       | true            |  
Item2       | false           |  
Item3       | false           |  

Item2 のデフォルト値を true に変更すると、すべての項目をループして残りの項目を false に設定するので、一度に 1 つだけ true になるので、次のようになります。

name:string | default:boolean |  
Item1       | false           |  
Item2       | true            |  
Item3       | false           | 

解決策

このコードは前の回答から抜粋され、わずかに簡略化されています。

def falsify_all_others
  Item.where('id != ?', self.id).update_all("default = 'false'")
end

このメソッドはモデルの before_save コールバックで使用できます。

実際には、次のように、どの値が「true」であるレコードのみを「改ざん」する方が良いでしょう。

Item.where('id != ? and default', self.id).update_all("default = 'false'")

更新: コードを DRY に保つには、Item の代わりに self.class を使用します。

self.class.where('id != ? and default', self.id).update_all("default = 'false'")