2.1 belongs_to関連付け
あるモデルでbelongs_to関連付けを行なうと、他方のモデルとの間に「1対1」のつながり
が設定されます。このとき、宣言を行ったモデルのすべてのインスタンスは、他方のモデルのインスタンスに文字どおり「従属(belongs to)」
します。
たとえば、Railsアプリケーションに著者(Author)と書籍(Book)情報が含まれており、書籍1冊につき正確に1人の著者を割り当てたいのであれば、Bookモデルで以下のように宣言します。
class Book < ApplicationRecord
belongs_to :author
end
.
.
.
belongs_toを単独で利用すると、一方向のみの「1対1」つながり
が生成されます。
つまり上の例で言うと、「個別の書籍はその著者を知っている」状態になりますが、「著者は自分の書籍について知らない」状態になります。
双方向関連付けをセットアップするには、belongs_to関連付けを使うときに相手側のモデルにhas_oneまたはhas_many関連付けを指定
します。
belongs_toでは「参照の一貫性」が担保されません。
そのため、ユースケースによっては以下のように参照カラムでデータベースレベルの外部キー制約(foreign_key: true)を追加する必要
があります。
create_table :books do |t|
t.belongs_to :author, foreign_key: true
# ...
end
出典
気づき
従属する宣言なのか。
-
belongs_to :author
は、author
クラスに従属することを宣言しているのか。 - 一方向のみの関係なのか。(これから理解できるようになる)
- 宣言しただけではいけないらしい。
データベースレベルの外部キー制約(foreign_key: true)を追加
する必要があるようだ。
2.2 has_one関連付け
has_one関連付けは、相手側の1つのモデルがこのモデルへの参照を持っていること
を示します。
相手側のモデルは、この関連付けを経由してフェッチできます。
class Supplier < ApplicationRecord
has_one :account
end
belongs_toとの主な違いは、リンクカラムsupplier_idが相手側のテーブルにある
ことです。
.
.
.
ユースケースによってはaccountsテーブルとの関連付けのために、supplierカラムに一意のインデックスか外部キー制約を追加する必要が生じる
こともあります。その場合、カラムの定義は次のようになるでしょう。
create_table :accounts do |t|
t.belongs_to :supplier, index: { unique: true }, foreign_key: true
# ...
end
このリレーションは、相手側のモデルでbelongs_to関連付けも設定することで双方向関連付けになります。
出典
気づき
何かここから難しくなってきた。
2.3 has_many関連付け
has_many関連付けは、has_oneと似ていますが、相手のモデルとの「1対多」のつながりを表す点が異なります
。has_many関連付けは、多くの場合belongs_toの反対側で使われます。
has_many関連付けは、そのモデルの各インスタンスが、相手のモデルのインスタンスを0個以上持っている
ことを示します。たとえば、さまざまな著者や書籍を含むアプリケーションでは、Author(著者)モデルを以下のように宣言できます。
class Author < ApplicationRecord
has_many :books
end
.
.
.
ユースケースにもよりますが、通常はこのbooksテーブルのauthorカラムに「一意でない」インデックスを追加し、オプションで外部キー制約を作成するのがよいでしょう。
出典
気づき
まず一対一、一対多の意味を知る必要があるようだ。
次の記事にこれは書くことにする。
これはUMLの中のなんかの図に説明があったような気がする。
関連記事