2012-12-10 30 views
2

我在教導自己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

回答

0

我相信這是你想要什麼:

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

不客氣!我也從中學到了一些東西。 –

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