
コミュニケーションのために3番目のテーブルを使用することは、多くの人にとって不要な場合があり、プロジェクトの開発にさらに困難を加えます。
PostgreSQL 9.1で追加された配列列を使用して3番目のテーブルを使用しないようにしましょう
Demoと呼ばれる小さなElixir Phoenixアプリケーションを作成して、デモを行いましょう。
$ mix phoenix.new demo $ cd demo
作成したテストを使用して順番に確認してください。
$ mix test
次に、グループに属するグループおよび投稿モデルを作成します。
$ mix phoenix.gen.model Group groups name:string $ mix phoenix.gen.model Post posts name:string body:text group_id:references:groups
次に、複数のグループに属することができるユーザーモデル(ユーザー)を作成します。 また、ユーザーは自分のグループの投稿エントリにのみアクセスできます。 ユーザーとグループをリンクする3番目のテーブルを作成する代わりに、usersテーブルに
group_ids列を追加しましょう。
$ mix phoenix.gen.model User users name:string group_ids:array:integer
Userモデルは次のようになります。
変更セットメソッドを使用すると、group_idsを変更できることに注意してください。 そのため、このメソッドを使用してユーザー自身でユーザープロファイルを編集すると、ユーザーは自分を任意のグループに追加できるようになります。 このロジックが自分に合わない場合は、追加の検証を追加して、group_idsの値がユーザーに許可されているグループのサブセットであることを確認できます。 または、ユーザーがgroup_idを変更できないようにすることもできます。
group_idsにインデックスを追加することも
できます :
CREATE INDEX users_group_ids_rdtree_index ON users USING GIST (group_ids gist__int_ops);
このために追加の移行を作成できます。
次に、
Post.accessible_by / 2メソッドを計画します。このメソッドは、ユーザーが使用できるグループからすべてのPostエントリを返します。 これを行うには、テストを作成します。
メソッドの実装:
ここでは、すべてのユーザーグループからすべての投稿エントリを取得します。
さらに進んで、Postエントリが一度に複数のグループに属するようにすることができます。 これを行うには、
usersテーブルと同じ方法で
group_ids列を
postsテーブルに追加し、
group_id列を削除し
ます 。 これで、Postレコードとユーザーgroup_ids配列にgroup_ids配列に少なくとも1つの共通要素がある場合にのみ、Postレコードをユーザーが使用できるようになります。
これを行うには
、PostgreSQLでオーバーラップ演算子を使用でき
ます 。 変更された投稿モデル:
演習として、移行をアップグレードして投稿テーブルと投稿モデルのテストを作成することもできます。 投稿テーブルのgroup_ids列に必ずインデックスを追加してください。
これが少なくとも誰かに役立つことを願っています。 ありがとう