32899


特定のカラムにメソッドを適用して一括で更新する時に`find_each`を使って如何にように書いているのですが、もっとよい書き方はありますか？

[code]

    Post.find_each do |post|
      post.update_column(:foo, post.foo&.downcase)
    end
    
[/code]

`update_all`は更新後の値が固定の場合だけしか使えませんし、何か定番の書き方があるかと思い質問いたしました。


CC BY-SA 3.0
2017-02-23T07:48:47.753
32894
2017-02-23T09:37:28.670
3271
question
ruby-on-rails ruby
特定のカラムに特定のメソッドを一括で適用する方法


一括更新はバルクアップデートやバルク更新などと言われています。

RDBMSがMySQLやPostgreSQLであればバルクインサート（一括挿入）と共に対応しています。  
ただし、Railsの場合はActiveRecord自体が未対応なのでgemに頼るかSQL直書きになります。

> 特定のカラムにメソッドを適用して一括で更新する時に`find_each`を使って如何にように書いているのですが、もっとよい書き方はありますか？

あなたの言う「よい書き方」とは何でしょうか？そのコードの目的は何でしょうか？  
それがほとんど実行されない一時的なものであれば、現状の分かりやすいコードのままにすることをお勧めします。  
もし頻繁に発生する処理だとすれば、まずは一括更新に頼らない方法を模索しましょう。今回の場合であれば`post.foo&.downcase`をDBに格納するのではなく、値の参照時に持ってくる、などです。

その上でバルクアップデートが必要であれば、[activerecord-
import](https://github.com/zdennis/activerecord-import)を使うことをお勧めします。  
コードについては[On Duplicate Key Update](https://github.com/zdennis/activerecord-
import/wiki/On-Duplicate-Key-Update)や関連記事等を参考にしてください。

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


CC BY-SA 3.0
2017-02-23T09:37:28.670
32899
2017-02-23T09:37:28.670
19925
32894
answer