我有一個連接表一個用戶組許多一對多關聯(group_partecipations),其還具有一個額外的「狀態」欄,其採用下列值:滑軌,查詢相關的記錄的條件
「所有者」(當存在對於給定的GROUP_ID和USER_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」嗎?
謝謝,但問題的關鍵是:有沒有一種方法可以從查詢中過濾掉(或避免首先包括)所有不是「掛起」的用戶(「所有者」和「接受」),以便不必稍後迭代查詢結果來收集那些「待處理」出來?我試圖學習AR查詢,所以我想先了解如何擠出最大值(從數據庫中得到我所需要的),以防萬一我還沒有完全做到這一點。之後,我將前往優化(並且已經爲我提供了一些有用的見解) – 2015-01-17 02:12:26
另外我也沒有理解'(group_participations :: users)'中包含嵌套關聯背後的原因?AR提供了一個關於「group_partecipation」沒有「用戶」關聯的錯誤。如果我輸入n ested關聯單數形式「:用戶」沒有錯誤,但我不知道這意味着什麼。 – 2015-01-17 03:31:58
Plz將精確的關係定義添加到問題中。我沒有運行查詢,但它應該只包括所需的用戶,如你所說。我會在明天詳細檢查這個 – 2015-01-17 10:34:07