如何通过关联表检索一组用户共有的关联对象/记录?

时间:2012-07-15 17:24:02

标签: sql ruby-on-rails ruby ruby-on-rails-3 activerecord

我正在使用Ruby on Rails 3.2.2,我希望同时检索由两个或多个用户关联的对象/记录 。也就是说,我有一个数据库表,我在其中存储用户和文章之间的关联数据;我想“构建” SQL查询,以便由两个或更多用户检索相关文章。例如,如果我有以下关联对象

#<UserArticleAssociation id: 1, user_id: 1, article_id: 1>
#<UserArticleAssociation id: 2, user_id: 1, article_id: 2>
#<UserArticleAssociation id: 3, user_id: 1, article_id: 3>
#<UserArticleAssociation id: 4, user_id: 2, article_id: 1>
#<UserArticleAssociation id: 5, user_id: 2, article_id: 2>    
#<UserArticleAssociation id: 6, user_id: 3, article_id: 1>
#<UserArticleAssociation id: 7, user_id: 3, article_id: 3>
#<UserArticleAssociation id: 8, user_id: 4, article_id: 4>

我想陈述/运行一个范围方法,以便获得如下内容:

@user1.articles.associated_by(@user2)
# => [ #<UserArticleAssociation id: 1, user_id: 1, article_id: 1>,
       #<UserArticleAssociation id: 4, user_id: 2, article_id: 1>]

@user1.articles.associated_by(@user3)
# => [ #<UserArticleAssociation id: 1, user_id: 1, article_id: 1>,
       #<UserArticleAssociation id: 7, user_id: 3, article_id: 3>]

@user1.articles.associated_by(@user4)
# => nil

@user2.articles.associated_by(@user3)
# => [ #<UserArticleAssociation id: 1, user_id: 1, article_id: 1>]

@user1.articles.associated_by([@user2, @user3])
# => [ #<UserArticleAssociation id: 1, user_id: 1, article_id: 1>]

换句话说,我想找到一组用户通过user_article_associations共同拥有的文章。我该怎么做?


涉及的类名称为

class User < ActiveRecord::Base
  has_many :article_associations, :class_name  => 'UserArticleAssociation'
  has_many :articles, :through => :article_associations
end

class Article < ActiveRecord::Base
  has_many :user_associations
  has_many :users, :through => :user_associations
end

3 个答案:

答案 0 :(得分:1)

使用merge组合关系:

articles = @user1.articles.merge(@user2.articles)

这将为您提供@user1&amp; @user2分享。您可以进一步调用merge以及其他文章关系,例如:

articles = @user1.articles.merge(@user2.articles).merge(@user3.articles)

答案 1 :(得分:1)

您应该在group_by

中使用having子句
Article.joins(:user_article_associations).
where('user_article_associations.user_id in (?)', users_ids)).
group('articles.id').
having('COUNT(user_article_associations.user_id in (?)) = ?',users_ids, users_ids.size)

答案 2 :(得分:0)

也许这样的事情会起作用:

Article.joins(:users).where('users.id in (?)', my_users.map(&:id)).group('articles.id')