Ruby on Railsメモ: find(:all)で、:joinsをつかうときには:select=>を指定するのがよいかも。

find(:all)は裏でselect * を発行して、結果のカラム名からオブジェクトのインスタンス変数リストを作るようになっているらしい。
しかも、複数の表をjoinして、表の間でカラムの名前がぶつかると、select *で後に出てくる方の値が、先に出てくる方の値を上書きして思っていたのと違う値がオブジェクトに入っていたりする。
例えば、Userクラスでfind(:all)を使って、user表とtag表をjoinして、両方にnameとかいうカラムがあったりすると、tag表のnameがUser#nameにはいってしまったりして、ハマることになる。
また、必要のないカラムまでデータベースから取ってきて、rubyオブジェクトに格納するのも非効率的だ。

こういうときには、:select => "user.*" とか指定しておくと、意図したとおりの値がオブジェクトに入ってくれる。

しかし、こんなこと考えるくらいなら、find(:all)など使わずに、最初から全部find_by_sqlをつかうほうが話が速いかも、とも思った。