aoのプログラミングブログ

あおのエンジニア学習日記

初心者のプログラミング学習記録。

Rails モデルの関連付けとは?

f:id:ao_pro_21:20220125114328p:plain

メッセージアプリを作る教材をやっていたら、突然出てきた「モデルの関連付け」。 使い方はわかったけれど、この「関連付け」って一体なに?何のためにするの?

疑問におもったのでお馴染みRailsガイドで調べてみました。

関連付け(association)

目的

モデル同士を関連付けることで、コードの共通操作を簡単にできるようにする。

例えば、ユーザーがそれぞれメッセージ投稿を行えるアプリケーションを作っているとして。

UserモデルとPostモデルがあったとする。

もし関連付けがされていないと、

  • Userが1つ投稿するときは、Post.createに毎回user.idを指定する文言を入れなければいけない。
@post = Post.create(user_id: @user.id)
  • Userを削除するときは、そのuser.idで登録されたメッセージを探し、メッセージを一つ一つ削除するコードを書いてから、user.destroyをしなければならない。
@posts = Post.where(user_id: @user.id)
@posts.each do |post|
  post.destroy
end
@user.destroy
  • 関連付けによってUserモデルとPostモデルが適切に結びつけられていれば、こうした記述をシンプルにすることができる。
class User < ApplicationRecord
  has_many :posts, dependend: :destroy
end

class Post < ApplicationRecord
  belongs_to :user
end
@post = @user.posts.create
@user.destroy

Railsのモデルの関連付けは6種類ある

  • belongs_to
  • has_one
  • has_many
  • has_many :through
  • has_one :through
  • has_and_belongs_to_many

関連付けはマクロのような呼び出しとして実装されている

  • モデルの関連付けを行うと、2つのモデルのそれぞれのインスタンスの間で、外部キーなどの情報を保持しておくように等の指示がRailsに伝わる。
  • 便利なメソッドもそのモデルに追加される。

「関連付け」はRailsの便利な機能だった

関連付けを書くだけで、Railsが勝手にモデル名を推測して、モデル間でコードの共通操作ができるようになる…。

すごいですね。

Railsソースコードにも記載があったので、今度読んでみようと思います。

参考資料