-1

受け入れたチームメンバーを説明するこの関連付けを含むプロジェクトモデルがあります (ステータス)

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 を返します...その結果を取得する方法がわかりません。

4

1 に答える 1

0

Arel は to_sql をサポートしているので、次のことができます。

a = Activity.find(1)
peeps = a.project.particpants.intersect a.project.participants #(sic)
Participant.find_by_sql(["SELECT participants.* FROM #{peeps.to_sql}", ...])

しかし、それ自体と交差する代わりに、あなたは次のことを意味していたと思います:

a = Activity.find(1)
peeps = a.particpants.intersect a.project.participants
Participant.find_by_sql(["SELECT * FROM #{peeps.to_sql}", ...])

クエリにパラメーターを提供する必要があります。

私はまた、関係を得るためにこのようなことをすることに成功しました

PublicActivity::Activity.from("(#{activities.to_sql} UNION #{task_activities.to_sql}) as activities").order("created_at DESC")
于 2013-08-28T05:49:24.800 に答える