【Elixir】Ecto で色々な関係の設定
Elixir の Ecto で色々な関連設定について詳しく解説します。has_one
, has_many
, belongs_to
, through
オプションに焦点を当てます。
その他のオプションについても以下のページで確認できますのでご参考にどうぞ
Ecto.Schema
基本的な has_oneの使い方
|
|
カラム名
- 外部キーは
Permalink
テーブルに作成されます。 - カラム名は
post_id
となります。
カラム名のカスタマイズ
foreign_key
を指定することで自分のテーブルのカラム名を指定できます。
|
|
相手先のIDの指定
references
を指定することで自分のテーブルのカラム名を指定できます。
|
|
where オプションの使用
where
を has_one
する際に条件が付与されます。
|
|
where は他の関連でも使用可能
このwhere
オプションはhas_one
だけでなく、has_many
やbelongs_to
など、他の関連でも使用できます。
through オプションの使用
|
|
この設定では、Post
がComment
を経由してAuthor
に関連していると定義されます。
has_many と belongs_to の違い
has_many
- 一対多(One-to-Many)の関連を表現。
- 親テーブルが子テーブルに対して複数のレコードを持つ。
- 親テーブル側で定義。
|
|
belongs_to
- 多対一(Many-to-One)の関連を表現。
- 子テーブルが親テーブルに対して1つのレコードを持つ。
- 子テーブル側で定義。
|
|
共通点と相違点
- 共通点: 両者は一対多の関連を形成するため、一緒に使われる。
- 相違点:
has_many
は"一対多"の"一"側で使われ、belongs_to
は"多"側で使われる。
まとめ
has_one
で基本的な一対一の関連を設定。foreign_key:
で外部キーのカラム名をカスタマイズ。references:
で相手先の特定のIDカラムを参照。where
オプションで関連を条件付きで制御。through
オプションで中間テーブルを経由した関連を設定。has_many
とbelongs_to
の違いと使い方。
Ectoは非常に柔軟な設定が可能で、これらのオプションを駆使することで、さまざまな要件に対応できます。