如何检索相关联的对象/记载,一组用户具有共同通过一个关联表? [英] How to retrieve associated objects / records that a set of users have in common through a association table?

查看:84
本文介绍了如何检索相关联的对象/记载,一组用户具有共同通过一个关联表?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用on Rails的3.2.2 Ruby和我想检索对象/记录的同时的关联由两个或两个以上的用户。也就是说,我有一个数据库表,我存储用户和文章之间的关联数据;我想打造的 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为H.
 

我会说出/运行的的范围方法的所以要得到类似以下内容:

  @ user1.articles.associated_by(@用户2)
#=> [#< UserArticleAssociation ID:1,USER_ID:1,article_id的:1>中
       #< UserArticleAssociation ID:4,USER_ID:2的article_id:1>]

@ user1.articles.associated_by(@用户3)
#=> [#< UserArticleAssociation ID:1,USER_ID:1,article_id的:1>中
       #< UserArticleAssociation ID:7,USER_ID:3的article_id:3>]

@ user1.articles.associated_by(@ USER4)
#=>零

@ user2.articles.associated_by(@用户3)
#=> [#< UserArticleAssociation ID:1,USER_ID:1,article_id的:1>]

@ user1.articles.associated_by([@用户2,@用户3])
#=> [#< UserArticleAssociation ID:1,USER_ID:1,article_id的:1>]
 

在其他人的话,我想找到一组用户的共同点通过 user_article_associations文章表格的。我怎么能作出这样的?


参与类表述为

 类用户的LT;的ActiveRecord :: Base的
  的has_many:article_associations,:将class_name => UserArticleAssociation
  的has_many:文章:通过=> :article_associations
结束

类文章<的ActiveRecord :: Base的
  的has_many:user_associations
  的has_many:用户:通过=> :user_associations
结束
 

解决方案

您应该使用具有GROUP_BY条款

  Article.joins(:user_article_associations)。
其中,('user_article_associations.user_id中(?),users_ids))。
组('articles.id')。
具有('COUNT(user_article_associations.user_id在(?))=?,users_ids,users_ids.size)
 

I am using Ruby on Rails 3.2.2 and I would like to retrieve objects / records simultaneously associated by two or more users. That is, I have a database table where I store association data between users and articles; I would like to "build" a SQL query so to retrieve associated articles by two or more users. For instance, if I have followings association objects

#<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>

I would to state / run a scope method so to get something like the following:

@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>]

In others words, I would like to find articles that a set of users have in common through the user_article_associations table. How can I make that?


Involved classes are stated as

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

解决方案

You should use having clause with group_by

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)

这篇关于如何检索相关联的对象/记载,一组用户具有共同通过一个关联表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆