2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

アソシエーションについて

Posted at

#目的
Railsでアプリを作成する場合、1つのモデルのみで作成されることは基本的にはないためそれぞれのモデルを紐づける必要がある機能を備忘録的に残しておきます。

#アソシエーションとは
モデルとモデルの関連付けのこと。
こちらはDB側の機能ではなく、Ruby on Rails側の機能です。

#外部キー
外部キーとは、2つのテーブルを結びつけるときに仕様するカラムのことです。
関連付けのために、テーブルに関連付けのために、テーブルに関連付けのカラムを追加することで実現させます。

#SQLとActiveRecord
関連付けはRDBMS内で結合文SQLを使う必要があります。
しかし、毎回SQLを書くのは大変のため、ActiveRecordがRubyとSQLの翻訳の働き(ORMapper)をしてくれるためRubyでコードを書けば関連付けができます。

#外部キーを設定する方法
今回はブログを作成した人の名前わかるアプリを作成します。
1.最初からモデルに外部キーを設定パターン
Userモデルを作成します。カラムはnameとemailにします。

rails g model User name:string email::text

同様に、Blogモデルの作るが、BlogモデルとUserモデルの関連づけるためにテーブルに関連付けのカラム(外部キー)を追加することが必要です。
blogsテーブルにuser_idカラムを追加します。

rails g model Blog title:string content:text user:references

関連付けの際に、referencesを使うことで以下のようなメリットがあります。
・自動的に外部キーが作成される
・自動的にインデックスが設定される

2.後付けでモデルに外部キーを設定パターン
すでにあるテーブルに関連付けカラムを設定する必要があります。

rails g migration AddUserRefTBlogs user:references

#アソシエーションの実装
Railsでは、結びつけたいテーブルのモデルに対して、has_many,belons_toを記述することでアソシエーションを設定できます。

ブログとユーザーを例にして実装していく。
ユーザーは複数のブログを作成することが可能なので以下のように記載する。

app/models/user.rb
class User < ApplicationRecord
  has_many :blogs
end

逆に、ブログは「一人」の著者に作成されているため以下のように記載します。

app/models/blog.rb
class Blog < ApplicationRecord
  belongs_to :user
end

モデルに定義されたアソシエーション名をそのままメソッドとして使用することができます。

#アソシエーションメソッドを使う
外部キー(今回の場合、user_id)はフォームで登録した際にカラムに値が入らないため値を入れてあげる必要があります。
buildメソッドで可能になります。

@blog = current_user.blogs.build(blog_params)

これは「ログイン中のユーザーのblogを,build(new)する」意味になります。

#まとめ
・モデルとモデルを紐づけるために外部キーが必要
・モデルにhas_many,belongs_toを記載することでアソシエーション名で関連付けしているカラムの情報を取得することが可能
・投稿時などの場合、外部キーカラムには値が入らないためbuildメソッドを使用して値を入れる必要がある

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?