与ActiveRecord和Rails 3的复杂JOIN

我有以下型号:

class User  :memberships end class Group  :memberships end class Membership < ActiveRecord::Base belongs_to :user belongs_to :group end class Post < ActiveRecord::Base belongs_to :group end 

我必须找到属于用户所属组的所有post。 我用这种方法做到了:

 @post = Post.joins(:group => {:memberships => :user}).where(:memberships => {:user_id => current_user.id}) 

但它会产生效率低下的SQL:

 SELECT "posts".* FROM "posts" INNER JOIN "groups" ON "groups"."id" = "posts"."group_id" INNER JOIN "memberships" ON "memberships"."group_id" = "groups"."id" INNER JOIN "users" ON "users"."id" = "memberships"."user_id" WHERE "memberships"."user_id" = 1 

我想做一个像这样的查询:

 SELECT posts.* FROM posts INNER JOIN memberships ON memberships.group_id = posts.group_id WHERE memberships.user_id = 1 

如何在不使用原始SQL的情况下执行此操作?

这样的东西应该适合你,虽然它需要混合一点原始SQL

 Post.joins("INNER JOIN memberships ON memberships.group_id = posts.group_id").where(:memberships => {:user_id => current_user.id}) 

通过从通话中删除未使用的连接,您可以在不更改模型的情况下靠近:

 Post.joins(group: :memberships).where(memberships: { user_id: 1 }) 

编译为SQL

 SELECT "posts".* FROM "posts" INNER JOIN "groups" ON "groups"."id" = "posts"."group_id" INNER JOIN "memberships" ON "memberships"."group_id" = "groups"."id" WHERE ("memberships"."user_id" = 1)