2016-12-07 4 views
2

現在、小さなプロジェクトで作業していて、データベースをより速くシードしたいと思っています。 "grand_total_points"という新しい列をユーザーのテーブルに移行しました。だから、もともと私はこのコードを使用していました。update_allの使い方は?より良い方法はありますか?

user = User.all 
user.each do |x| 
    x.grand_total_points = x.total_points 
    x.save! 
end 

私は100万レコードを更新する必要があるため、これには時間がかかります。 Total_pointsは、提出されたすべてのユーザーポイントを計算するユーザーモデルで既に定義されています。私の説明を許してください。 update_allメソッドを使用する方法がありますが、それぞれに含まれていますか?可能

答えて

2

うん、:、

UPDATE "users" SET "grand_total_points" = 'total_points' 

total_points場合は、列が、インスタンスメソッドではありませんupdate_all問合せにロジックを移動:

User.update_all('grand_total_points = total_points') 

それは次のSQLクエリを生成します。

User.update_all("grand_total_points = #{total_points calculation translated into SQL terms}") 
+0

'total_points'はユーザーごとに異なります。すべてのユーザーに対して' total_points'が同じ場合にのみ使用できます。 – Thanh

+0

@ThanhHuynhそれはタイプミスで、 'total_points'(':total_points')の前にコロンがあったはずです –

+0

私は試しましたが、うまくいきません。このコードは、すべてのユーザの 'grand_total_points'カラムを' total_points'文字列に更新します。 – Thanh

0

私はうまくいくものを見つけました。だから基本的に私は実行SQLステートメントとルビーコードを結合し、私はそれをマイグレーションファイルに入れます。コードの仕組みは次のとおりです。私はこれが役立つことを願っていますデータに基づいてクエリに従うことを確認してください。

その後、bundle exec rake db:migrateを実行する必要があります。普通の方法では2〜3時間かかります。これは私に2分しかかかりませんでした。

関連する問題