2015-01-14 2 views
0

시청에 내가 레일 테이블에 3 루비가 : 사용자, 그룹 및 게시물 (플러스 a를 has_and_belongs_to_many 표 "groups_users"을 가입) ..... 여기에서 액티브 쿼리 has_and_belongs_to_many 관계

이 관련 테이블 정의입니다 :

create_table "posts", force: true do |t| 
    t.integer "user_id" 
    t.integer "group_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "groups", force: true do |t| 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "users", force: true do |t| 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "groups_users", id: false, force: true do |t| 
    t.integer "user_id", null: false 
    t.integer "group_id", null: false 
    end 

그리고 모델 :

Group Model: 
    has_and_belongs_to_many :users, dependent: :destroy 
    has_many :posts, inverse_of: :group, dependent: :destroy 

User Model: 
    has_many :posts, inverse_of: :user, dependent: :destroy 
    has_and_belongs_to_many :groups, dependent: :destroy 
    has_many :groupposts, through: :groups, source: :posts, class_name: "Post" 

Post Model: 
    belongs_to :group, inverse_of: :posts 
    belongs_to :user, inverse_of: :posts 

사용자가 어떤 그룹 (GROUP_ID == 전무)하지 않고 일반 게시물을 할 수 있도록 게시물의 그룹이 NULL이 될 수도 있고, 그들은 게시물을 만들 수 있습니다 그들이 속한 그룹 중 하나에서

내게 줄 수있는 단일 Active Record Query가 있는지 알아 내려고합니다. (1) 모든 사용자의 모든 일반 게시물 (group_id 없음), PLUS (2) 모든 그룹의 모든 게시물 사용자가 속합니다.

그래서 같은 :

Post.where(:group_id => nil) 

고유과 결합 : 동일한에서 그 결과를 가질 수 없습니다

Post.includes(:groups [:users]).where("(posts.group_id IS NULL) OR (posts.groups.users CONTAINS ?)", @user.id) # THIS IS NOT CORRECT, THE SECOND HALF OF THE 'OR' STATEMENT IS GARBAGE 

답변

0

:

@user.groupposts 

나는의 근처에 뭔가 생각 검색어 (UNION를 사용하여 전체 검색어를 작성하는 경우 가질 수 있음) y 우리의 조건은 동일한 필드에 적용되고 있으므로 두 가지 쿼리를 사용해야합니다.

일반 게시물에 대한이

Post.where("group_id is null") 
#or in scope 
scope :general_posts, lambda { where ("group_id is null") } 

과이 당신

+0

당신을 감사에게 도움이 될 수 사용자 그룹

Post.where(group_id: User.uniq.pluck(:id)) #scope scope :user_groups, lambda { where(group_id: User.uniq.pluck(:id)) } 

희망의 모든 게시물을 시도 할 수 있습니다. 나는 upvote에 너무 새롭다, 그러나 당신의 응답은 아주 도움이된다! – gravy