2013-03-01 58 views
-1

我有一個項目模型W /該協會介紹團隊成員已接受(狀態)如何在arel中相交兩個關聯?

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 

其作品,但將返回阿雷爾::節點::相交...不知道如何抓住從結果。

+0

任何這運氣? – 2014-06-20 05:34:54

+0

不,仍然使用.to_sql:/ – 2014-06-20 14:37:44

+1

看到我的問題,以及我如何使它現在工作:http://stackoverflow.com/questions/24320469/how-to-write-activerecord-arel-intersection-query/24323622 #24323622 – 2014-06-20 15:19:29

回答

0

由於阿雷爾支持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") 
相關問題