0
0

More than 1 year has passed since last update.

クラスの関連付け

Last updated at Posted at 2023-02-10

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の中のなんかの図に説明があったような気がする。

関連記事

0
0
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
0
0