Join 三方关联查询/有多个:通过/加入

Join 三方关联查询/有多个:通过/加入,join,ruby-on-rails-3.2,has-many-through,Join,Ruby On Rails 3.2,Has Many Through,我正在使用可用的指南/API/书籍自学Rails,但我很难理解与三种方式/嵌套方式的连接:通过关联 我有用户通过会员身份与组连接 我也有组的多对多帖子。同一帖子可以发布到多个群组+群组可以有多个帖子 我希望能够为用户的主页显示用户所属组的所有不同帖子 例如,当前的_user.groups.posts#我希望它能这么简单 这是我的密码 Models: class User < ActiveRecord::Base has_many :memberships has_many :gr

我正在使用可用的指南/API/书籍自学Rails,但我很难理解与三种方式/嵌套方式的连接:通过关联

我有用户通过会员身份与组连接

我也有组的多对多帖子。同一帖子可以发布到多个群组+群组可以有多个帖子

我希望能够为用户的主页显示用户所属组的所有不同帖子

例如,当前的_user.groups.posts#我希望它能这么简单

这是我的密码

Models:

class User < ActiveRecord::Base
  has_many :memberships
  has_many :groups, :through => :memberships
  has_many :posts  # as author of post
end

class Group < ActiveRecord::Base
  has_many :memberships
  has_many :users, :through => :memberships
  has_and_belongs_to_many :posts
end

class Membership < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
end

class Post < ActiveRecord::Base
  belongs_to :user
  has_and_belongs_to_many :groups
end
主控制器.rb#索引

class HomeController
这显然只是给了我一个所有组中所有帖子的非清晰列表

如果有人能给我指出正确的方向。 我试过了,但就我所知,没有一个例子适用


如果您需要我提供更多信息,请告诉我。:D

我相信这就是您想要的:

Post.includes(:groups => :users).where('users.id' => current_user.id)
这将生成如下SQL(对于
current_user.id=1
):


另见:(不完全相同,但相似)

多亏了@shioyama,我最终用他的答案为Post创建了一个模型方法:

def self.posts_for_users_groups(current_user)
  includes(:groups => :users).where('users.id' => current_user.id)
end
我从我的家庭控制器呼叫:

def index
  @user_visible_posts = Post.posts_for_users_groups(current_user)
end

再次感谢@shioyama:D

非常感谢您!!!这正是我所需要的。看来我需要学习更多关于过滤器的知识。再次感谢!
SELECT "posts"."id" AS t0_r0, "posts"."user_id" AS t0_r1,
  "posts"."created_at" AS t0_r2, "posts"."updated_at" AS t0_r3,
  "groups"."id" AS t1_r0, "groups"."created_at" AS t1_r1,
  "groups"."updated_at" AS t1_r2, "users"."id" AS t2_r0,
  "users"."name" AS t2_r1, "users"."created_at" AS t2_r2,
  "users"."updated_at" AS t2_r3
  FROM "posts"
  LEFT OUTER JOIN "groups_posts" ON "groups_posts"."post_id" = "posts"."id"
  LEFT OUTER JOIN "groups" ON "groups"."id" = "groups_posts"."group_id"
  LEFT OUTER JOIN "memberships" ON "memberships"."group_id" = "groups"."id"
  LEFT OUTER JOIN "users" ON "users"."id" = "memberships"."user_id"
  WHERE "users"."id" = 1
def self.posts_for_users_groups(current_user)
  includes(:groups => :users).where('users.id' => current_user.id)
end
def index
  @user_visible_posts = Post.posts_for_users_groups(current_user)
end