2013-09-25 91 views
3

我有類似如下:Rails的:如何將多個ActiveRecord關聯結合單個集合

class Group < ActiveRecord::Base 
    has_many :group_projects, dependent: :destroy 
    has_many :projects, through: :group_projects 
end 

class Projects < ActiveRecord::Base 
    has_many :group_projects, dependent: :destroy 
    has_many :groups, through: :group_projects 

    has_many :time_entries 
end 

class TimeEntry < ActiveRecord::Base 
    belongs_to :project 
end 

所以,project.time_entries返回屬於該項目time_entries的ActiveRecord::Associations::CollectionProxy

我要的是有關與特定組作爲一個集合相關聯的所有項目的所有time_entries的列表,而不必像做:

TimeEntry.where(["project_id IN (?)", @group.projects.map{|p| p.id } ]) 

PS:使用Rails 4.0.0 | ruby 2.0.0

+0

傳遞映射項目到您的查詢有什麼問題?我懷疑有沒有內置的幫手來幫助完成這件事。 – zeantsoi

+0

@zeantsoi試過這樣做: time_entries = group.projects.map {| p | p.time_entries} 我可以把它變成一個單一的數組,但就是這樣 - 一個數組 - 所以我可以使用它的任何ActiveRecord方法(例如:.where等)。我所追求的是所有可以應用ActiveRecord方法的time_entries的ActiveRecord關係/集合 – olvado

+0

瞭解。請參閱下面的答案。 – zeantsoi

回答

2

根據subset conditions的邊緣文檔,可以將數組傳遞給where()查詢的條件散列。這將返回一個ActiveRecord::Relation,而不是對象的數組:

TimeEntry.where(project_id: @group.projects(&:id)) 

使用注意事項的映射速記(用符號的部分)的。這是一個替代的和(可能)對多個對象進行返回單個屬性的陣列更可讀的方法:

@group.projects.map{|p| p.id} == @group.projects(&:id) 
+0

謝謝@zeantsoi,這是我一開始就在做的事! :)我試圖合理化查詢,以減少SQL加載時間。事實證明,這是增加負載的其他東西。事情現在好多了。 – olvado

1

除了zeantsoi答案,還可以使用:

TimeEntry.where(project_id: @group.project_ids) 

@group。 project_ids將返回該組所有標識的數組。

我希望它有幫助。

+0

漂亮的把戲!謝謝你的提示 –

0

我不知道這是有可能在這個問題被張貼的時間,但現在has_many :through似乎是承擔這一任務的明顯的和語義的選擇:

# Group 
has_many :time_entries, through: projects 

然後你就可以這樣做:

@group.time_entries 
相關問題