5

Ruby on Rails のポリモーフィックな関係に似たものを実装しようとしています。次の 3 つのテーブルがあります。

イベント ユーザー 組織

イベントは、ユーザーまたは組織のいずれかが所有者になることができるため、私の Events テーブルには、owner_type と owner_id という列が含まれています。

内部結合と where 句を使用して、ユーザーまたは組織に属するすべてのイベントを簡単にリストできますが、結合テーブルを owner_type 列の値に基づいて条件付きにし、すべてのイベントを一緒にリストできるようにする方法はありますか? owner_type に関係なく?

それが理にかなっていることを願っています。

アドバイスをいただければ幸いです。

ありがとう。

4

4 に答える 4

7

結合テーブルを条件付きにすることはできないため、この場合、イベントをユーザーと組織の両方に結合し、coalesce を使用して共通フィールド (名前など) を結合する必要があります。

select e.id, coalesce(u.name, o.name) owner_name
from events e
left join users u on e.owner_id = u.id and e.owner_type = 'user'
left join organisations o on e.owner_id = o.id and e.owner_type = 'org'

ただし、(id、type、org_id、name、...) のような構造を持つ、ユーザーと組織の両方を含む所有者テーブルの作成を検討することもできます。これには単一の結合のみが必要ですが、スキーマの他の領域が複雑になる可能性があります。組織のユーザー メンバーシップ。

別の方法として、ユーザー テーブルと組織テーブルを結合し、イベントから 1 回結合する方法があります。

于 2010-02-25T11:21:09.363 に答える
2

eventowner_model_01



  • Ownerすべての所有者サブタイプに共通の列があります。
  • PersonOrganizationそれぞれに固有の列があります。
于 2010-02-25T11:26:40.633 に答える
0

Events所有権情報を 2 つの結合テーブルEventsUsersから移動するのはどうですか(それぞれのテーブルには、FKと適切な所有オブジェクト テーブルのEventsOrganisations2 つの列しかありません)。Events次にUNION、結合テーブルを介して所有オブジェクト テーブルに結合する 2 つのクエリを実行できます。

于 2010-02-25T11:21:36.893 に答える