2012-07-13 30 views
0

鑑於以下型號:如何編寫包含第三個模型並進行篩選的rails查詢?

User (id) 
    has_many :groups 
    has_many :communities 

Groups (community_id (OPTIONAL)) 
    belongs_to :user 
    belongs_to :community 

Communities (id, archived (boolean)) 
    has_many :groups 
    has_many :group_members, :include => :user 

我可以很容易地通過做得到用戶的羣體:

current_user.groups

的問題是,如果一個社會的存檔,我不想說在current_user.groups中返回。

如何獲取社區未歸檔的所有用戶組?

感謝

+0

您如何表示社區已歸檔? – 2012-07-13 20:49:58

+0

Community.archived – AnApprentice 2012-07-13 20:50:26

+1

請張貼該方法。反映檔案數據庫的哪些變化。 – 2012-07-13 20:51:41

回答

1

current_user.groups.joins(:community).where('communities.archived' => false)

+0

僅供參考,事實證明這不起作用,因爲它不會返回沒有community_id的組,這意味着GROUP(community_id)爲零。這些應該在上面的查詢中返回。想法? – AnApprentice 2012-07-15 22:35:29

+1

對不起,我忽略了這一點。原因是默認情況下'joins'轉換爲SQL'INNER JOIN'。爲了讓它返回沒有社區id的組,你需要一些轉換成'OUTER JOIN'的東西。不幸的是,據我所知,目前還沒有辦法在rails中以獨立於數據庫的方式進行此操作。你必須通過加入一個SQL查詢,比如「OUTER JOIN communities ON groups.community_id = community.id''。您必須根據您選擇的數據庫來修改確切的查詢。 – cdesrosiers 2012-07-16 00:46:12

0

這可能是有點笨重,但你可以很容易地遍歷current_user.groups,並檢查是否每個組的社區已被封存。也許是這樣的

all_groups = current_user.groups 
final_list = [] 
all_groups.each { |g| 
    if !g.community.archived 
    final_list << g 
    end 
} 

這將通過所有的current_user的羣體,並檢查每一個,如果他們存檔。如果不是,則將其添加到名爲final_list的數組中。可能有更優雅的做法,但至少可以讓你知道你應該做什麼。

+0

謝謝,但這是一個相當沉重的解決方案。 SQL只是目標 – AnApprentice 2012-07-15 22:35:50

相關問題