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でフォロー・フォロワーのリレーションやってるし…やってたときは急ぎ急ぎで進めていたところが有るので、改めて読んでよくわかった。