最初は、モデルに関連付けを追加していきます。以下のように書いて下さい。以下2つのモデルには共通で、has_many :user_clipsと書きます。そしてユーザークリップを介して、ユーザーはクリップを、クリップはユーザーを複数持つと記述します。
class Clip < ApplicationRecord
has_many :user_clips
has_many :users, through: :user_clips
class User < ApplicationRecord
has_many :user_clips
has_many :clips, through: :user_clips
ここでhas_many throughについて解説します。
XとYというモデルがあり、Zという中間モデルがあるとします。
newsableでいえば、Clip(X)とUser(Y)というモデルがあり、user_clips(Z)という中間モデルがあることになります。
この3つのモデルの関連付けを行う場合にhas_many throughを使用します。
Xというモデルフォルダ内でYというモデルとZという中間モデルとの関連性を示す場合、
class X< ApplicationRecord
has_many :Z
# Zモデルを間に取って、Yモデルと関連付ける
has_many :Y, through: :Z
と記述します。
Clip.rbフォルダを例にすると、以下のようになります。
ユーザークリップには、自動的に記述されているので何も追加しません。記述されている内容は以下の通りです。
class UserClip < ApplicationRecord
belongs_to :clip
belongs_to :user
現在のデータベースの状況を確認しておきます。現在、クリップとユーザーにはデータがあり、ユーザークリップにはデータがありません。
では、関連付けが上手くいっているかコンソールで試してみましょう。ユーザーを2人分作成して、クリップも作成します。そして、ユーザークリップの作成を行いuser1のクリップを確認します。
まずは、user1 = User.first というコードを打ち込んでエンターを押してください。
このコードでuser1という変数に最初に登録されたuserの情報が代入されます。
同様に user2 = User.last というコードを打ち込んでエンターを押します。
これで、user2という変数にnewsableで最後に登録されたuserの情報が代入されます。
次に user1.clips とコードを打ち込んでエンターを押します。
user1がクリップした記事があればここで表示されますが、user1に紐づいた記事はまだない為この時点では何も表示されません。
clip = Clip.first
というコードを打ち込んでエンターをおします。 これでClipモデルのデータベースに登録されている最初の記事がcllipという変数に代入されます。
user1.user_clips.create(clip: clip)
とコードを打ち込んでエンターを押します。
user1.clips
と打ち込んでもう一度user1に紐づいているクリップを確認してみましょう。 user1に記事がクリップされていることがわかります。
ここまでのコンソールの内容をまとめると以下になります。
> user1 = User.first #=> test@test.com
> user2 = User.last #=> yoshida@example.com
> user1.clips #=> [ ] #まだクリップはない
> clip = Clip.first #=> https://www.yahoo.co.jp
> user1.user_clips.create(clip: clip) #=> 関連を作成
> user1.clips #=> yahooがクリップされている
では、データベースはどのように変わったかを以下の例で確認します。ユーザークリップには、クリップとユーザー、ユーザークリップのidを含むレコードが作成されています。
ユーザークリップをもうひとつ作成してみましょう。新たにクリップを作成して、user1と紐づけます。
コンソールに clip = Clip.last と打ち込んでエンターを押します。先ほどclipモデルに登録されている記事の中から最初の記事を登録しましたが、今度は登録されている記事の中から最後の記事を登録して新たにクリップを作成します。
user1.user_clips.create(clip: clip)
とコードを打ち込んでエンターを押します。
user1.clipsuser1 = User.first
というコードを打ち込んでエンターを押してください。
新たにuser1にクリップされた記事が表示されます。
ここまでのコンソールの操作をまとめると以下になります。
> clip = Clip.last #=>https://www.youtube.com/
> user1. user_clips.create(clip: clip) #=> 関連を作成
> user1.clips #=> youtubeがクリップされている
全項目の課題で作成した、ArticleCategoryの関連付けを行いコンソールから作成してみましょう。以下手順を参考に行って下さい。
無料ビデオ講座のお知らせ
Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。