has_many関連にfind_sqlを指定した場合の注意

ActiveRecordでhas_many関連の抽出にSQLを指定したい場合、:find_sqlシンボルをキーにSQL文を指定することができる。もちろん、has_manyなので、自身のモデルに関連するオブジェクトを抽出したいはずなので、自身のid(オブジェクトidではない)をSQL文に渡したい。

ではどうするかというと、#{id}SQL文に入れることで自動的に自身のid(オブジェクトidではない)に変換してくれる。

すべてはここに書いてあった。
http://wiki.rubyonrails.org/rails/pages/has_many

で、僕は最後までキッチリ読まなかったのではまったのだが、

"SELECT * FROM something WHERE user_id = #{id}"

実は、これでは、#{id}にオブジェクトid(Object#id)が入ってしまうため上手く行かない。これはhas_manyがスタティックメソッドなので、このメソッドを実行したときのidといえば、Object#idなのだろう。RubyではClassもObjectですから。

では、どうすればよいかというと、シングルクウォートで#{id}を評価しないようにするとよいのである。

'SELECT * FROM something WHERE user_id = #{id}'

これだけ。