处理复杂的ActiveRecord关联

时间:2012-07-08 23:27:52

标签: mysql ruby activerecord associations hierarchy

我正试图建立一个相当复杂的关系。正如您从下面的SQL中可以看出的那样,我在这里有三个(如果你包括用户)四个模型。成员,小组和角色。

用户通过会员资格属于群组,会员本身可以发挥作用。因此,用户通过会员资格在组中发挥作用。

我想要做的是通过用户在会员资格中的角色订购特定群组的会员资格。角色具有与之相关的“等级”。所以,CEO = 3,Department Chair = 2,Manager = 1,Worker = 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

干杯!

2 个答案:

答案 0 :(得分: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')

答案 1 :(得分:0)

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

完成后,如果您需要访问附件属性,可以创建该模型,并使用has_many :join_model_name或者如果您只需要直接进入其中一个已加入的模型,可以使用has_and_belongs_to_many :model_name

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

感谢Hargrimm的帮助!