2

以下の例は 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 で同じことを (できれば最小限の変更で) どのように行うことができるかということです。

4

1 に答える 1