0

我正在尝试建立一个相当复杂的关系。从下面的 SQL 中可以看出,我在这里使用了三个(如果包括 User,则为四个)模型。成员、组和角色。

用户通过成员资格属于组,成员资格本身可以具有角色。因此,用户通过成员资格在组中具有角色。

我想要做的是通过用户在成员资格中的角色来订购特定组的成员资格。角色有一个与之相关的“等级”。因此,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

干杯!

4

2 回答 2

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')
于 2012-07-09T21:38:57.787 回答
0

当您处理复杂的连接查询时,我发现最好创建一个表示连接模型的视图。

完成此操作后,如果有需要访问和使用的附件属性,has_many :join_model_name或者您只需要直接访问其中一个已连接的模型,则可以创建该模型,您可以使用has_and_belongs_to_many :model_name

当然可以在 6 个月内从经验中学到很多东西 :)

谢谢哈格林的帮助!

于 2013-03-07T13:46:39.740 回答