2015-01-15 52 views
1

我有一個連接表一個用戶組許多一對多關聯(group_partecipations),其還具有一個額外的「狀態」欄,其採用下列值:滑軌,查詢相關的記錄的條件

  • 「所有者」(當存在對於給定的GROUP_IDUSER_ID對沒有其它記錄被自動設置:這意味着該用戶是該組的創建者/所有者)

  • 「待定」(這是當用戶加入的羣組設置的默認值,但他們不是創造者,這意味着他們正在等待羣組創建者接受他們)

  • 「接受」(當創建者接受未決用戶)

我明白,DB規範化規則,我應該在另一個表中提取此列,但現在我會離開它這樣。

所以..現在,我試圖創建一個查詢,對於給定的用戶,他所擁有的所有組以及與該組的用戶一起處於「掛起」狀態。

雖然我找到了一個解決方案,但它感覺非常複雜,我真的不確定這是一個好方法,所以我想要一些建議。

這就是我想出了:

首先,我發現所有組,其中用戶是所有者:

groups_where_owner = u.groups.where(group_partecipations: {status: "owner" }) 

# u.groups would return all groups: 
# either those in which user is owner and those where he is pending or has been accepted 

然後對每一個他自己的小組中我回發集團本身的數組在「待定」的用戶:

groups_where_owner.map { |g| 
     [ g, 
     User.includes(:group_partecipations).where 
     (:group_partecipations => {:group_id => g.id, status: "pending" }) 
     ] 
} 

但正如我所說,這種感覺髒和太多的「手工製作」,我想了解,如果我爲了對付沒有錯過在ActiveRecord的一個重要組成部分有了這種情況。

另外,當我將結果轉換爲JSON ojbect時,它有一個額外的嵌套層次,我希望避免這種嵌套。

所以..有沒有更好的方法?或者,什麼是正確的方法

在此先感謝您的幫助。

編輯:我的問題的關鍵點是:有沒有辦法修改我的AR查詢,以過濾掉(或避免包括在第一個地方)所有的用戶誰不是「掛起」(「所有者」s和「接受的」或多個),從而不具有稍後查詢結果迭代以收集那些「未決的」 s」嗎?

回答

1

這樣共可接受的解決方案。

然而它可以被改進,以使較少的查詢到db。目前你對每個own_group執行一個單獨的查詢,IO操作比cpu操作慢多倍,因此,一次加載所有必要的數據然後處理它是一種更好的策略。

Group.includes(group_participations: :user) 
    where(group_participations: {status: "pending" }). 
    where(id: user.groups.where(group_participations: {status: "owner" }).ids). 
    map { |g| [g, g.users]} 
+0

謝謝,但問題的關鍵是:有沒有一種方法可以從查詢中過濾掉(或避免首先包括)所有不是「掛起」的用戶(「所有者」和「接受」),以便不必稍後迭代查詢結果來收集那些「待處理」出來?我試圖學習AR查詢,所以我想先了解如何擠出最大值(從數據庫中得到我所需要的),以防萬一我還沒有完全做到這一點。之後,我將前往優化(並且已經爲我提供了一些有用的見解) – 2015-01-17 02:12:26

+0

另外我也沒有理解'(group_participations :: users)'中包含嵌套關聯背後的原因?AR提供了一個關於「group_partecipation」沒有「用戶」關聯的錯誤。如果我輸入n ested關聯單數形式「:用戶」沒有錯誤,但我不知道這意味着什麼。 – 2015-01-17 03:31:58

+0

Plz將精確的關係定義添加到問題中。我沒有運行查詢,但它應該只包括所需的用戶,如你所說。我會在明天詳細檢查這個 – 2015-01-17 10:34:07