私はかなり複雑な関係を構築しようとしています。以下の SQL からわかるように、ここでは 3 つの (User を含める場合は 4 つ) モデルが使用されています。メンバーシップ、グループ、および役割。
ユーザーは、それ自体がロールを持つことができるメンバーシップを介してグループに属します。したがって、ユーザーはメンバーシップを通じてグループ内の役割を持っています。
私がやりたいことは、ユーザーがメンバーシップに持っている役割を介して特定のグループのメンバーシップを注文することです。ロールには「ランク」が関連付けられています。したがって、CEO = 3、部門長 = 2、マネージャー = 1、従業員 = 0 (たとえば)。問題を複雑にするために、ロールは別のロールに従属することができます。したがって、CEO は取締役会と呼ばれる役割の一部である可能性があり、部門長とマネージャーは上級管理職 (または何か) と呼ばれる役割の一部である可能性があります。
以下の私の SQL からわかるように、私はそれを機能させました。グループを見つけたときに group.memberships と言うことができるように、これを ActiveRecord アソシエーションに変換する方法を理解する必要があります。役割ランクへ。
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
乾杯!