3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ectoで他のスキーマを参照するスキーマを生成する

3
Posted at

Ectoで他のスキーマを参照するスキーマを生成する

マイグレーションファイル&スキーマモジュールの作成

次のコマンドを実行する。

mix ecto.gen.schema コンテキスト.スキーマ テーブル名 カラム:データ型

テーブル参照

テーブル参照をする場合にはマイグレーションファイルに
以下の記述を行う。

  • referencesで参照するテーブルを指定
  • 参照されるテーブルへの制約の追加

referencesで参照するテーブルを指定

referencesでは参照するテーブルの指定を行う。

参照するカラム(デフォルトではid)を追加するには、
add :スキーマ名_id, references(:テーブル名)
と記述する。

参照されるテーブルへの制約の追加

テーブルによっては値が一意である必要な場合がある。一意制約をテーブルに追加するためには、
create unique_index(:テーブル, [:フィールド])
と記述する。

またこの場合スキーマモジュールのchangesetには
unique_constraint([:フィールド])
を追加する必要がある。

スキーマファイルには以下の記述を追加する必要がある。

  • belongs_toで参照先スキーマを指定。
  • has_one、has_manyで参照元との関係を記述。

belongs_toで参照先スキーマを指定

スキーマファイルに参照元を追加するにはbelongs_toを記述する必要がある。

belongs_toに
belongs_to :role, Roles
と記述することで参照先スキーマを指定することができる。

has_one、has_manyで参照元との関係を記述

スキーマに参照元を記述するためにはhas_onehas_manyを記述する必要がある。

参照元と1対1であればhas_one、1対多であればhas_manyを記述する。

また以下のように記述を行う

  • has_one - has_one :user, User
  • has_many - has_many :role, Roles

クエリから参照する

参照先はpreloadを使用することで参照することができる。

import Ecto.Query

def list_employee() do
    query = 
        from e in Employee,
        preload: [:role, :user] 

    Repo.all(query)
end

結論

これらをまとめると他のスキーマを参照するスキーマを定義する方法は

  1. mix phx.gen.schemaでマイグレーションファイルとスキーマモジュールを作成。
  2. 生成されたマイグレーションファイルに、references()で参照先テーブルを記述する。
  3. 生成されたスキーマモジュールにbelongs_toで参照先スキーマを記述する。(changesetも書き換える。)
  4. 既存の参照先スキーマモジュールに参照元のスキーマを記述する。

となる。

3
1
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?