使用三种方式关联/ has_many查询:通过/ join

问题描述:

我在教导自己Rails使用指南/ apis/books可用,但我无法理解用三种方式连接/嵌套has_many:通过关联。使用三种方式关联/ has_many查询:通过/ join

用户连接:通过成员

我也有的帖子在多对多的。相同的帖子可以发布到许多组+组可以有很多帖子。

我希望能够做的就是为用户的主页,显示全部为用户是其成员的不同岗位

例如。 current_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 

的routes.rb

Myapp::Application.routes.draw do 
    get "admin/index" 
    devise_for :users 

    resources :users do 
    member do 
     get :groups 
    end 
    end 

    resources :groups do 
    member do 
     get :members 
     post :join 
     post :leave 
    end 
    end 

    resources :posts 

home_controller.rb#指数

class HomeController < ApplicationController 
    before_filter :authenticate_user! 

    def index 
    @user = current_user 
    @groups = Group.all 
    @user_groups = @user.groups 
    @home_page_posts = Post.joins(:groups, :user) 
    end 
end 

这显然只是给了我所有组中的所有帖子的非重复的名单。

如果任何人都可以指出我正确的方向。 我试过http://guides.rubyonrails.org/active_record_querying.html#joining-tables,但根据我所见,没有任何示例适用。

请让我知道你是否需要我提供更多的信息。:d

我相信这是你想要什么:

Post.includes(:groups => :users).where('users.id' => current_user.id) 

这将产生这样的SQL(为current_user.id = 1):

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 

参见:Filter model with multiple has many through(不完全一样,但相似)

+0

太谢谢你了!这完全符合我的需要。看起来我需要更多地了解过滤器。再次感谢! – pedrogrande

+0

不客气!我也从中学到了一些东西。 –

感谢@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