Railsの関連付けの復習した

Railsの関連付けについて復習したので書いておく。

今回は

  • belongs_to
  • has_one
  • has_many
  • has_many :through

を使ったのでそれらについて。

belongs_to

「1対1」の関連付けで使う。
rails g model foo bar:references のようにreferencesを使用すると生成されるModelに勝手についてくれる。
また、生成されるmigrationファイルにも t.references :bar, foreign_key: trueと、barの外部キーを付けてくれる。
Bar belongs_to Foo って読めるようになっている。クラス名のシンボルは単数形で指定する。

has_one

「1対1」の関連付けで使う。
これを使うのはbelongs_toで指定されたクラスの方。

class Foo < ApplicationRecord
  has_one :bar
end

みたいに書いておくと、Foo#barが生えて、いい感じに取得できる。

has_many

「1対多」の関連付けで使う。
これもbelongs_toで指定されたクラスに対して指定する。

class Foo < ApplicationRecord
  has_many :bars
end

これはクラス名を複数形で指定する。自然だ。
これでFoo#barsが生える。

has_many :through

「多対多」を表現したいとき、2つのモデルの間にリレーション用のテーブルを作るのが一般的。
そして、そのリレーションテーブルの先の本当に取得したいデータを知りたい時に使う。

class Invitation < ApplicationRecord
  belongs_to :schedule
  belongs_to :user
end

class Schedule < ApplicationRecord
  has_many :invitations
  has_many :invitees, through: :invitations, source: :user
end

class User < ApplicationRecord
end

これを使用するためにはひと手間必要で、

  • リレーション用のモデルをhas_manyで指定する。
  • 知りたいクラスをhas_many :生やしたい関係名 , through: :リレーションモデル, source: :知りたいクラス名 で指定する。

を行う必要がある。
↑のコードだと、invitationsでリレーションを取得して、本当に知りたいユーザー情報をSchedule#inviteesで取得できるようになっている。

ニュアンスで書いているけど、ActiveRecordの中身を深掘りするのはもう少しあとで…

ここまで書いたけど

1次情報と、Railsガイドと、自分で過去に作ったソースコードを読むのがやっぱり理解が進んで良い。
自分の場合は過去にRails Tutorialでフォロー・フォロワーのリレーションやってるし…やってたときは急ぎ急ぎで進めていたところが有るので、改めて読んでよくわかった。