使用三种方式关联/ 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(不完全一样,但相似)
答
感谢@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
太谢谢你了!这完全符合我的需要。看起来我需要更多地了解过滤器。再次感谢! – pedrogrande
不客气!我也从中学到了一些东西。 –