特定のカラムに特定のメソッドを一括で適用する方法

投稿者: Anonymous

特定のカラムにメソッドを適用して一括で更新する時に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や関連記事等を参考にしてください。

参考:
http://paranishian.hateblo.jp/entry/2015/11/06/142412
http://qiita.com/ysk_1031/items/d669157225e67d3a40bf

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *