JavaScriptを有効にしてください

【Elixir】Ecto で色々な関係の設定

 ·  ☕ 2 分で読めます

【Elixir】Ecto で色々な関係の設定

Elixir の Ecto で色々な関連設定について詳しく解説します。
has_one, has_many, belongs_to, throughオプションに焦点を当てます。

その他のオプションについても以下のページで確認できますのでご参考にどうぞ
Ecto.Schema

基本的な has_oneの使い方

has_one/3

1
2
3
4
5
6
7
defmodule Post do
  use Ecto.Schema

  schema "posts" do
    has_one :permalink, Permalink
  end
end

カラム名

  • 外部キーはPermalinkテーブルに作成されます。
  • カラム名はpost_idとなります。

カラム名のカスタマイズ

foreign_key を指定することで自分のテーブルのカラム名を指定できます。

1
has_one :permalink, Permalink, foreign_key: :custom_post_id

相手先のIDの指定

references を指定することで自分のテーブルのカラム名を指定できます。

1
has_one :permalink, Permalink, references: :custom_id, foreign_key: :post_id

where オプションの使用

wherehas_one する際に条件が付与されます。

1
has_one :active_permalink, Permalink, where: [deleted_at: nil]

where は他の関連でも使用可能

このwhereオプションはhas_oneだけでなく、has_manybelongs_toなど、他の関連でも使用できます。

through オプションの使用

has_many/has_one :through

1
has_many :comments_authors, through: [:comments, :author]

この設定では、PostCommentを経由してAuthorに関連していると定義されます。

has_many と belongs_to の違い

has_many

has_many/3

  • 一対多(One-to-Many)の関連を表現。
  • 親テーブルが子テーブルに対して複数のレコードを持つ。
  • 親テーブル側で定義。
1
2
3
4
# Postモデル
schema "posts" do
  has_many :comments, Comment
end

belongs_to

belongs_to/3

  • 多対一(Many-to-One)の関連を表現。
  • 子テーブルが親テーブルに対して1つのレコードを持つ。
  • 子テーブル側で定義。
1
2
3
4
# Commentモデル
schema "comments" do
  belongs_to :post, Post
end

共通点と相違点

  • 共通点: 両者は一対多の関連を形成するため、一緒に使われる。
  • 相違点: has_manyは"一対多"の"一"側で使われ、belongs_toは"多"側で使われる。

まとめ

  • has_oneで基本的な一対一の関連を設定。
  • foreign_key:で外部キーのカラム名をカスタマイズ。
  • references:で相手先の特定のIDカラムを参照。
  • whereオプションで関連を条件付きで制御。
  • throughオプションで中間テーブルを経由した関連を設定。
  • has_manybelongs_toの違いと使い方。

Ectoは非常に柔軟な設定が可能で、これらのオプションを駆使することで、さまざまな要件に対応できます。

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer