RailsでもしNULLだったらデータを入れる(SQLレベルでチェック)

Railsで値が入っていたら変更したくなく、NULLの場合だけデータを入れたいという場合があったのですが、ActiveRecordのインスタンス側でチェックをするとタイミングによってNULLじゃない場合にも入ってしまう可能性があるのでSQLでチェックして更新するというのをやってみました。

Railsでのコードは

User
  .where(id: 10, status: nil)
  .update_all(status: 1)
UPDATE users SET users.status = 1 WHERE id = 10 AND users.status IS NULL;

NULL以外でもstatusが1の場合だけ2にするというようにも使えます。

User
  .where(id: 10, status: 1)
  .update_all(status: 2)
UPDATE users SET users.status = 2 WHERE id = 10 AND users.status = 1;