その「名前」の値にフィルタを適用することにより、テーブル全体を更新する必要があります。このコード:ルビーon RailsのActiveRecordの効率
entries = select('id, name').all
entries.each do |entry|
puts entry.id
update(entry.id, { :name => sanitize(entry.name) })
end
私はRuby on Railsをにかなり新しいですし、見つかったそれは興味深い、というのが私の選択クエリ単一の行選択に分割されています。
SELECT `entries`.* FROM `entries` WHERE (`entries`.`id` = 1) LIMIT 1
SELECT `entries`.* FROM `entries` WHERE (`entries`.`id` = 2) LIMIT 1
SELECT `entries`.* FROM `entries` WHERE (`entries`.`id` = 3) LIMIT 1
...
私は理解しているように、それはRailsのが提供する、最適化のようなものだ - 一度にそれが必要だだけの行(毎サイクル)ではなく、すべてのエントリを選択します。
しかし、この場合は本当に効率的ですか?つまり、データベーステーブルに1000のレコードがある場合、1つのクエリよりも1000のクエリを作成する方が良いでしょうか?そうでない場合、どのようにRailsにクエリごとに複数の行を選択させることができますか?
もう1つの質問は、このクエリによってすべての行が更新されるわけではありません。提供された値がすでに存在する場合(つまり、entry.name == sanitize(entry.name)の場合)、Railsは更新クエリを無視しますか?