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

      2016/03/22

Code部

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名をスネークケースで記述します。

 

user = User.find(1)
p user.social_account.name

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

 

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

 

account = SocialAccount.find_by(name: “レイルズ”)

p account.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を記述することでRuby on Railsが自動的に、関連性を担保してくれます。

 

 

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

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

 

user = User.find(1)

user.posts

 

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

post = Post.find(1)

p post.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(“title like ?”, “%#{title}%”)

 

# 記事数を取得

Posts.count

 

# 削除

post.destory

post2.destory

 

 

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

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

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

 

要件は下記になります。

 

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

・タイトルをつけられる

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

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

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

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

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

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

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

※ 表示件数は任意

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

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

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

クが表示されている。

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

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

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

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

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

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

  1. 記事の更新

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

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

 

 

 

NEXT LESSON ☛ gemをみてみよう!

PREV LESSON ☛ ログアウト機能を実装しよう!

目次 - Ruby & Ruby on Rails テキスト目次 –

 - Ruby on Rails, プログラミング, プログラミング基礎