我有一个带有此关联的项目模型,该关联描述了已接受(状态)的团队成员
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,并采摘一列。我发现这里描述了相交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 ... 不知道如何从中获取结果。