質問: 特定のカラムにメソッドを適用して一括で更新する時に`find_each`を使って如何にように書いているのですが、もっとよい書き方はありますか? ``` Post.find_each do |post| post.update_column(:foo, post.foo&.downcase) end ``` `update_all`は更新後の値が固定の場合だけしか使えませんし、何か定番の書き方があるかと思い質問いたしました。
回答: 一括更新はバルクアップデートやバルク更新などと言われています。 RDBMSがMySQLやPostgreSQLであればバルクインサート(一括挿入)と共に対応しています。 ただし、Railsの場合はActiveRecord自体が未対応なのでgemに頼るかSQL直書きになります。 > > 特定のカラムにメソッドを適用して一括で更新する時に`find_each`を使って如何にように書いているのですが、もっとよい書き方はありますか? > > > あなたの言う「よい書き方」とは何でしょうか?そのコードの目的は何でしょうか? それがほとんど実行されない一時的なものであれば、現状の分かりやすいコードのままにすることをお勧めします。 もし頻繁に発生する処理だとすれば、まずは一括更新に頼らない方法を模索しましょう。今回の場合であれば`post.foo&.downcase`をDBに格納するのではなく、値の参照時に持ってくる、などです。 その上でバルクアップデートが必要であれば、activerecord-importを使うことをお勧めします。 コードについてはOn Duplicate Key Updateや関連記事等を参考にしてください。 参考: