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}'
これだけ。