多対多を理解する(ユーザーごとにクリップ作成?) | SkillhubAI(スキルハブエーアイ)

多対多を理解する(ユーザーごとにクリップ作成?)

ユーザーごとにクリップ作成?

まず、作業の前にcreate-userclipという新しいブランチを作成しましょう。以下コマンドを実行して下さい。

$ git checkout -b create-userclip 

では、今の問題点を詳しく確認します。現状では、クリップが誰のものかはわからない状態です。現状のままで以下のようにマイクリップという機能を追加しても、他人のクリップも一覧に出てきてしまいます。

file

以下のように自分のクリップだけ表示させるのが、望ましい状態ですね。

file

これは、ユーザーとクリップを結ぶモデル(中間モデル)を作成することで個別クリップを実現する事が出来ます。

file

関連付けを図で表すと以下のようになります。クリップはたくさんのユーザーを持つことができます(※たくさんのユーザーが1つの記事をクリップすることができます)。

file

反対にユーザーもたくさんのクリップを持つことができます。

file

データ構造で表すと以下のようになります。ユーザーはたくさんのクリップを持つ事が出来て、クリップもたくさんのユーザーを持つ事が出来ます。

そして、この2つのモデルをつなぐユーザークリップという中間モデルを作成します。ユーザークリップは、ユーザー・クリップそれぞれのidを属性として持ちます。このような関連付けを、多対多と言います。

file

データを見ながらユーザークリップを作成

このデータ構造を参考にして、実際にユーザークリップモデルを作成していきます。以下コマンドを実行して下さい。中間モデルを作成するときは、関連付けたい2つのモデルそれぞれにreferencesと指定します。referencesは、指定したモデルのidを属性として持つことが出来るというものです。

$ rails g scaffold UserClip user:references clip:references
$ rails db:migrate

file

file

ユーザークリップモデルを作成する事によって、クリップ数を表示できるようになります。ユーザークリップのレコード数が増えればクリップ数が分かるという仕組みです。

file

課題

ArticleにカテゴリーをScaffoldで作成しましょう。カテゴリーの属性は、name:stringとして下さい。

そして、関連付けも行います。アーティクルは複数のカテゴリーを持つし、カテゴリーは複数のアーティクルを持ちます。中間テーブルはArticleCategoryというモデル名にしてください。これはモデルのみでもOKです。