0

私はかなり複雑な関係を構築しようとしています。以下の 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

乾杯!

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または結合されたモデルの1つに直接アクセスする必要がある場合は、そのモデルを作成できます。has_and_belongs_to_many :model_name

確かに6ヶ月の経験から多くを学ぶことができます:)

ハーグリム、助けてくれてありがとう!

于 2013-03-07T13:46:39.740 に答える