受け入れたチームメンバーを説明するこの関連付けを含むプロジェクトモデルがあります (ステータス)
Class Project < ActiveRecord::Base
has_many :participants, :through => :team_members, :source => :user, :conditions => ['team_members.status = ?', TeamMember::STATUS[:accept]]
参加者もいるアクティビティモデルがあります
Class Activity < ActiveRecord::Base
belongs_to :project
has_many :participants, :through => :collaborations, :source => :user
まだ承認されていないチーム メンバーを含む可能性のあるアクティビティ参加者。したがって、これら 2 つの関連付けの交差が必要です。私の目標は、関連付けの sql を繰り返さずに 1 つのクエリを実行し、1 つの列を取り出すことです。ここで説明されている Intersect を見つけましたhttp://www.rubydoc.info/github/rails/arel/Arel/SelectManager#intersect-instance_methodとhttps://github.com/rails/arel/commit/からその使用法を推測しようとしていました74caeaad157e79853b9c6804f561d3c70eea2346 . しかし、私は運がありません。
私がこれまでに得た最高のものは次のとおりです。
a = Activity.find(1)
team = a.project.participants.select('user_id').to_sql
peeps = a.participants.where("user_id in (#{team})")
peeps.pluck('thecolumn')
これは 1 つのクエリを実行し (良い)、関連付けのロジックを繰り返さず (良い)、1 つの値の直後にいるのですべての AR オブジェクトをロードしません (良い)。ただし、次のことができることを望んでいました。
a = Activity.find(1)
peeps = a.project.particpants.intersect a.project.participants
これは機能しますが、Arel::Nodes::Intersect を返します...その結果を取得する方法がわかりません。