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

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

# # # # # # # # 

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

 @user1.articles.associated_by(@user2) # => [ #, #] @user1.articles.associated_by(@user3) # => [ #, #] @user1.articles.associated_by(@user4) # => nil @user2.articles.associated_by(@user3) # => [ #] @user1.articles.associated_by([@user2, @user3]) # => [ #] 

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


涉及的类别表示为

 class User  'UserArticleAssociation' has_many :articles, :through => :article_associations end class Article  :user_associations end 

你应该在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) 

使用merge来组合关系:

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

这将为您提供@user1@user2共享的所有文章。 您可以进一步调用merge与文章的其他关系,例如:

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

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

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