以下の例は Rails 3 では機能しますが、Rails 4 では失敗します。
その理由はRelation
、アソシエーションにアクセスして返された が、「所有」ID を補間するのではなく、実際のデータベース パラメータを使用するようになったためです。
class Blog < ActiveRecord::Base
has_many :posts, :dependent => :destroy
end
class Post < ActiveRecord::Base
belongs_to :blog
end
b = Blog.first # provided something exists of course
query = Post.where(id: b.posts.where("'complicated query' = ''")); 1 # just to avoid printing in console
puts query.to_sql
# SELECT "posts".* FROM "posts" WHERE "posts"."id" IN (SELECT "posts"."id" FROM "posts" WHERE "posts"."blog_id" = $1 AND ('complicated query' = ''))
query.to_a
# raises the error:
# PG::UndefinedParameter: ERROR: there is no parameter $1
# LINE 1: ...M "posts" WHERE "posts"."blog_id" = $1 AND
# ^
$1
明らかにメインクエリから提供されていないサブクエリのパラメータに注意してください(したがってエラー)。
そこで問題は、Rails 4 で同じことを (できれば最小限の変更で) どのように行うことができるかということです。