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

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

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

$ git checkout -b create-userclip 

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

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

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

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

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

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

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

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

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

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

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

課題

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

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

無料ビデオ講座のお知らせ

Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。

無料講座一覧を見る

×