2012-07-08 78 views
0

我試圖建立一個相當複雜的關係。正如您從下面的SQL中可以看出的那樣,我在這裏有三個(如果包含User的話)模型。成員,組和角色。處理複雜的ActiveRecord協會

用戶通過成員身份歸屬於團體,成員身份本身可以發揮作用。因此,用戶通過成員身份在組中扮演角色。

我想要做的是通過用戶在成員資格中具有的角色對特定組的成員資格進行排序。角色擁有與其相關的「排名」。因此,CEO = 3,部門主席= 2,經理= 1,工作人員= 0(例如)。使事情複雜化,一個角色可以從屬於另一個角色。因此,CEO可以成爲董事會的一部分,而部門主席和經理可以成爲高層管​​理人員(或其他)的一部分。

正如你可以從我下面的SQL看到的,我已經得到它的工作,我只需要弄清楚如何將它變成一個ActiveRecord協會,以便當我找到一個組時,我可以說group.memberships和應按照角色排序。

SELECT `memberships`.* from `memberships` 
INNER JOIN `groups` ON `groups`.id = `memberships`.group_id 
INNER JOIN `roles` ON `memberships`.role_id = `roles`.id 
INNER JOIN `roles` `role_cat` ON `role_cat`.id = `roles`.type_id 

WHERE `groups`.id = "HHC" AND `memberships`.expiration > CURDATE() 
ORDER BY `role_cat`.rank DESC, `roles`.rank DESC 

乾杯!

回答

0

如果你確定查詢你想要做什麼,這就是我覺得最簡單的方式來獲得的AR關係了吧,因爲你有一個group你想要做的查詢:

group.memberships.joins(:role). 
    joins('join roles as roles_cat on role_cat.id=roles.type_id'). 
    where("groups.id='HHC' and memberships.expiration>curdate()"). 
    order('role_cat.rank desc, roles.rank desc') 
0

當您處理複雜的加入查詢時,我發現最好創建一個代表連接模型的視圖。

一旦你做到了這一點,你可以創建一個模型是否有您需要訪問附件屬性,並使用has_many :join_model_name或者如果您只是需要的權利,通過連接模型的一個到達,你可以使用has_and_belongs_to_many :model_name

當然可以學到很多經驗,從6個月:)

謝謝Hargrimm對你有所幫助!