3

利用可能なガイド/API/書籍を使用してRailsを独学していますが、関連付けを介した3方向/ネストされた has_many との結合を理解するのに問題があります。

メンバーシップを通じて、グループに接続されたユーザーがいます。

groupsを使用した多対多の投稿もあります。同じ投稿を複数のグループに投稿できます + グループには複数の投稿を含めることができます。

私ができるようにしたいのは、ユーザーのホームページに対して、ユーザーがメンバーであるグループの個別の投稿をすべて表示することです。

例えば。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

ルート.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#index

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

4

2 に答える 2

1

これがあなたが望むものだと思います:

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

これにより、次のような SQL が生成されます ( for 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

参照:複数のフィルター モデルには多くのスルーがあります(まったく同じではありませんが、類似しています)。

于 2012-12-10T15:38:37.177 に答える
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

于 2012-12-11T02:56:58.643 に答える