SELECT の後ろに参照・更新したいフィールドを並べて find_by_sql を呼ぶと、 参照・変更したいフィールドだけを持ったモデルのインスタンスが返ってくる、 というのを知る。無駄なオブジェクトを作らないで済むし、 更新時も取ってきたフィールドだけを set するので、 パフォーマンス的には有利。id を含めないと更新はできないみたい。そりゃそうか。
でも、やっぱり SQL 文は長いよ、と思いつつ、active_record/base.rb を読んでると、 find に :select ってのが使えるじゃないですか!デフォルトは "*"、 つまりは、その部分をベタに :select => "id, status, error_count" とか書いとけば OK。
>> pp Product.find(:first) #<Product:0xb7a63c4c @attributes= {"image_url"=>"http://localhost:3000/images/097669400X.01.LZZZZZZZ.jpg", "date_available"=>"2005-09-22 00:00:00", "price"=>"34.95", "title"=>"Agile Web Development with Rails", "id"=>"1", "description"=> "Bible for Rails'er.\r\nYou should buy the Japanese translated version as well :).\r\n"}> >> pp Product.find(:first, :select => "id, title, price") #<Product:0xb7a510c4 @attributes= {"price"=>"34.95", "title"=>"Agile Web Development with Rails", "id"=>"1"}>
Index で見る限り、AWDwR の時点ではなかった機能なのかな。
…と思ったら、全部書いてあった :)。
でも callback で使ってるのを指定し忘れるワナ。