我有一个项目模型w /此关联描述已接受(状态)
的团队成员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
活动参与者可能包括尚未接受的团队成员。所以,我想要这两个关联的交集。我的目标是做1个查询,不重复关联的sql,并拔出一个列。我在此处找到了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')
这是一个查询(好),不重复关联的逻辑(好)并且不加载所有AR对象,因为我只是在一个值(好)之后。但是,我希望能够:
a = Activity.find(1)
peeps = a.project.particpants.intersect a.project.participants
有效,但返回Arel :: Nodes :: Intersect ...不确定如何从中获取结果。
答案 0 :(得分: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")