【Rails応用講座 7】ユーザークリップを作成する >
ユーザークリップの関連付け

ユーザークリップの関連付け

最初は、モデルに関連付けを追加していきます。以下のように書いて下さい。以下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

1.has_many through

ここで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のクリップを確認します。

1.$ rails cでコンソールを起動させます。

2.ユーザーを2人分作成します。

まずは、user1 = User.first というコードを打ち込んでエンターを押してください。

このコードでuser1という変数に最初に登録されたuserの情報が代入されます。

同様に user2 = User.last というコードを打ち込んでエンターを押します。

これで、user2という変数にnewsableで最後に登録されたuserの情報が代入されます。

3.user1に紐づいているクリップの確認

次に user1.clips とコードを打ち込んでエンターを押します。

user1がクリップした記事があればここで表示されますが、user1に紐づいた記事はまだない為この時点では何も表示されません。

4.クリップを作成します。

clip = Clip.first

というコードを打ち込んでエンターをおします。 これでClipモデルのデータベースに登録されている最初の記事がcllipという変数に代入されます。

5.関連の作成

user1.user_clips.create(clip: clip)

とコードを打ち込んでエンターを押します。

6.user1に紐づいているクリップの確認

 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と紐づけます。

1.$ rails cでコンソールを起動させます。

2.クリップを作成します。

コンソールに clip = Clip.last と打ち込んでエンターを押します。先ほどclipモデルに登録されている記事の中から最初の記事を登録しましたが、今度は登録されている記事の中から最後の記事を登録して新たにクリップを作成します。

3.関連の作成

user1.user_clips.create(clip: clip) 

とコードを打ち込んでエンターを押します。

4.user1に紐づいているクリップの確認

user1.clipsuser1 = User.first

というコードを打ち込んでエンターを押してください。 新たにuser1にクリップされた記事が表示されます。

ここまでのコンソールの操作をまとめると以下になります。

> clip = Clip.last #=>https://www.youtube.com/
> user1. user_clips.create(clip: clip) #=> 関連を作成
> user1.clips #=> youtubeがクリップされている

課題

全項目の課題で作成した、ArticleCategoryの関連付けを行いコンソールから作成してみましょう。以下手順を参考に行って下さい。

  • 最初のアーティクルを取り出し変数articleに入れる
  • 新規カテゴリーを作成し変数categoryに入れる
  • その2つの関連を作成する
  • article.categoriesを実行すると追加されたカテゴリーを閲覧することができる
  • 無料ビデオ講座のお知らせ

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

    無料講座一覧を見る