作って学ぶRuby on Rails Vol.30Modelのリレーションを設定しよう!

作って学ぶRuby on Rails Vol.30Modelのリレーションを設定しよう!
目次
  1. Modelのリレーション
  2. ・has_manyについて
  3. ・外部キーの定義の仕方
  4. ・TRYユーザーの記事投稿機能を作成してみましょう

Modelのリレーション

で、UserというModelに対してSocialAccountというModelを紐付けていますが、UserとSocialAccountをuser_idというカラムを利用することでリレーションさせています。前項

UserというModelのidに対して、SocialAccountというModelのuser_idが1対1なのでhas_oneとbelongs_toという関係が成り立ちます。

この関係性が成り立つ場合に、下記の様な記述でUserというModelからSocialAccountというModelを参照することができます。

※参照する際は、Model名をスネークケースで記述します。

上記コードの結果として、Googleに登録した名前が表示されます。

また、逆にSocialAccountというModelからUserというModelを参照することも可能になります。

paccount.user.name

上記コードの結果として、UserというModelに登録された名前が表示されます。

・has_manyについて

has_oneとbelongs_toについては学習しましたが、has_manyとbelongs_to

例えば、ユーザーが記事を投稿する際、ユーザー1名に対してそのユーザーが投稿した記事は複数紐づくことになります。この場合、ユーザーと投稿は1:nの関係になります。

ユーザーの投稿する記事をPostというModelとした場合に、UserというModelはPostというModelを複数持つため、has_oneではなくhas_manyになります。Post側は、UserというModelに属している形なのでbelongs_toになります。

has_manyとbelongs_toの実装方法として、1:nのn側のModelに紐づくテーブルのカラムに参照先のModelのIDを持たせる必要があります。

例えば、UserというModelとPostという投稿記事情報を表すModelが存在し、それらの関係が1:nだったとします。

User : Post = 1 : n

この場合、UserというModelには、has_many:postと記述し、PostというModelにはbelongs_to:userという記述が必要になります。そして、PostというModelはUserというModelに属しているため、UserというModelのIDを保持しなければいけません。このIDを外部キー

・外部キーの定義の仕方

外部キーを定義する際は、参照先のModel名(スネークケース)+_idとして定義する必要があります。

例:


class CreatePosts < ActiveRecord::Migration
  def change
  create_table :posts do |t|
  t.integer :user_id
  t.string :title
  t.text :post_text

  t.timestamps null: false
  end
  end
end

上記コードは、記事情報を持つModelを作成する際のマイグレーションファイルの例です。作成する際にinteger(数値型)でuser_idと定義しています。これは、PostというModelがUserというModelを参照する際に使用する外部キー

外部キーを定義し、has_many、belongs_toを記述することでRubyonRailsが自動的に、関連性を担保してくれます。

下記のコードで1:nの関係性を持つModelを参照することができます。

※参照する際は、Model名を複数形にしたスネークケースで記述します。

user.posts

逆に、下記のように記述することでPostからUserというModelを参照することもできます。

ppost.user.name

上記のコードの結果として記事を投稿したユーザー名が表示されます。

Modelをリレーションさせた際に使用できるメソッド#作成user=User.create(name:“レイルズ”)#記事情報を作成(buildを行うことで、UserというModelと関連性を持つ記事情報を作成する)post=taro.posts.build(title:“記事のタイトル”)#記事情報を保存するpost.save#2つ目の記事を作成し保存する(createを行うことで、作成&保存を行う)post2=user.posts.create(title:“記事その2”)#リレーション#記事情報を配列で取得するuser.posts#記事情報の存在確認(存在すればtrueしなければfalse)user.posts.exists?#記事情報が存在確認2(存在しなければtrue存在すればfalse)user.posts.empty?#記事情報が属しているユーザー情報を取得(単数形である点に注意)post.user#記事のidが1のものを取得user.posts.find(1)#記事タイトルで検索user.posts.find_by(title:“記事その2”)#記事タイトルであいまい検索title=“その2”user.posts.where(“titlelike?”,“%#{title}%”)#記事数を取得Posts.count#削除post.destorypost2.destory

・TRYユーザーの記事投稿機能を作成してみましょう

『作って学ぶRubyonRailsシリーズ』で学習してきたことを生かし、ユーザーの記事投稿機能を作成してみましょう。(ブログやSNSのイメージ)

見た目の部分(CSSや画像等)のデザインは要件には含めないため、自由にデザインして下さい。

要件は下記になります。

  • ユーザーが投稿できる記事の内容は以下である

・タイトルをつけられる

・記事本文(文字数制限は特にありません)

・記事に画像を1つ以上投稿できる。

  • 各ユーザーが投稿した記事の一覧を見ることができる

・ページ内に記事の投稿ボタンが表示されており記事の投稿ページへ遷移できる。

・各記事の、タイトル、投稿者名、投稿日時が一覧表示されている

・一覧表示は、投稿日時が現在日時と近い記事から順に表示されている。

・一覧表示はページネーションにより、1ページに表示する件数が決まっている。

※表示件数は任意

・各記事のタイトルをクリックするとその記事の詳細ページが表示される。

・各記事の投稿者名をクリックするとその投稿者のプロフィールが表示される。

・記事の投稿者がログインしている自身のユーザーであれば、編集ページへのリン

クが表示されている。

・記事の投稿者がログインしている自身のユーザーであれば、削除ボタンが表示さ

れており、削除することができる。

  • 各記事の詳細ページを閲覧できる

・タイトル、投稿日時、投稿者名、記事本文、記事の画像が表示されている。

・一覧へもどるボタンが存在する

・投稿者名をクリックするとその投稿者のプロフィールが表示される。

  • 記事の更新

・記事の投稿者がログインしている自身のユーザーであれば、タイトル、記事本文

の編集、画像の変更ができる。

NEXTLESSONgemをみてみよう!gemをみてみよう!

PREVLESSONログアウト機能を実装しよう!ログアウト機能を実装しよう!

目次-Ruby&RubyonRailsテキスト目次目次-Ruby&RubyonRailsテキスト目次

Tech 2 GO編集部
ライター
Tech 2 GO編集部

関連記事