2015-01-14 78 views
0

我有3个Ruby on Rails的表:用户,组和帖子(加上一个连接的has_and_belongs_to_many表“groups_users”).....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 

一个邮政集团可能为空,这样用户就可以使普通的帖子,没有任何集团(GROUP_ID ==无),或者他们可以使文章在他们所属的一个小组内。我试图找出是否有单个活动记录查询会给我: (1)来自任何用户的所有普通帖子(无group_id),PLUS(2)所有帖子到任何组的一个a组织用户属于。

因此,像:

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我们的条件适用于同一领域,您应该有2个不同的查询。

对于邮政你可以用这个

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