使用するクエリfinder_sql
がPostgreSQLに渡される前に正しく解析されず、データベース構文エラーが発生するという問題があります。
問題を説明するために、ここからサンプルコードを使用しました。
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
人物モデルがないので変更class_name
しただけですが、ここでは関係ありません。"User"
has_many :subscribers, :class_name => "User", :finder_sql =>
'SELECT DISTINCT people.* ' +
'FROM people p, post_subscriptions ps ' +
'WHERE ps.post_id = #{id} AND ps.person_id = p.id ' +
'ORDER BY p.first_name'
これを使用すると、次のエラーが発生します。
User Load (0.3ms) SELECT DISTINCT people.* FROM people p, post_subscriptions ps WHERE
ps.post_id = #{id} AND ps.person_id = p.id ORDER BY p.first_name
PGError: ERROR: Syntaxerror near »{«
LINE 1: ...ople p, post_subscriptions ps WHERE ps.post_id = #{id} AND p...
^
ご覧のとおり#{id}
、オブジェクトのIDに置き換えられていないため、PostgreSQLエラーが発生します。
環境
- レール3.1
- rvm
- PostgreSQL 9.1
- Ubuntu 11.10
- Ruby 1.9.2p290(2011-07-09リビジョン32553)[x86_64-linux]