2015-01-14 4 views
0

У меня есть 3 Рубин на Rails таблиц: пользователи, группы и сообщения (плюс присоединиться к таблице «groups_users» для has_and_belongs_to_many) .....ActiveRecord запрос для соединения 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 

Группа A Пост может быть Null, так что пользователи могут сделать общие сообщения без каких-либо групп (group_id == ноль), или они могут сделать сообщения в пределах одной из групп, к которым они принадлежат.

Я пытаюсь выяснить, есть ли один запрос активной записи, который даст мне: (1) все общие сообщения (no group_id) от любого пользователя, PLUS (2) все сообщения в любую группу, что Пользователь принадлежит.

Так что-то вроде:

Post.where(:group_id => nil) 

однозначно присоединился:

@user.groupposts 

Я думаю, что это что-то в районе:

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

Вы не можете иметь этот результат в том же запрос (вы можете получить его, если вы напишете полный запрос с помощью UNION), так как y наши условия применяются для одного и того же поля, у вас должно быть два разных запроса.

Для General Post вы можете попробовать с этим

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

Всех сообщениями от групп пользователей

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

Надеется, что это может помочь вам

+0

спасибо. Я слишком новичок здесь, чтобы поддержать, но ваш ответ очень полезен! – gravy

Смежные вопросы