Relation#update(id, attributes)
ドキュメントには、「オブジェクトがデータベースに正常に保存されたかどうかに関係なく、結果のオブジェクトが返される」と記載されてRelation#update_all(updates, conditions = nil, options = {})
いますが、インスタンス化、コールバック、または検証は行われない (ストレート DB クエリ) と記載されています。
簡単な性能テストを実行して に置き換えるRelation#update
とRelation#update_all
、メモリ消費量が増加したようです。
説明はありますか?
抜粋:
#Before
MyModel.update(my_hash['id'], special_attrs)
#After (more memory consumed)
MyModel.where(:id => my_hash['id']).update_all(special_attrs)
#Update-2 (slightly more memory consumed than with update(id, attrs)
MyModel.update_all(special_attrs, {:id => my_hash['id']})
- Windows XP (うん、わかってる)
- JRuby 1.6.8 (1.9)
- レール 3.2.8
UPDATE - 比較のためのいくつかの基本的な数値: 起動された約 700 の更新ステートメントでは、約 0.6MB (ステートメントごとに 0.8kB) の差があります。
更新 2 - @philip-hallstrom の提案に従って AREL チェーンを削除しました。メモリ フットプリントがわずかに減少しましたが、それでもMyModel.update_all(attrs, conditions)
よりも多くのメモリを消費していますMyModel.update(id, attrs)
。