1

Ruby on Rails 3.2.2 を使用しており、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
4

3 に答える 3

1

merge関係を組み合わせるために使用します。

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

@user1これにより、共有するすべての記事が表示され@user2ます。mergeさらに、記事の追加の関係を呼び出すことができます。例:

articles = @user1.articles.merge(@user2.articles).merge(@user3.articles)
于 2012-07-15T18:02:53.097 に答える
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)
于 2012-07-16T15:54:42.013 に答える
0

たぶん、このようなものがうまくいくでしょう:

Article.joins(:users).where('users.id in (?)', my_users.map(&:id)).group('articles.id')
于 2012-07-16T14:46:29.203 に答える