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_oneかhas_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
結論
これらをまとめると他のスキーマを参照するスキーマを定義する方法は
-
mix phx.gen.schemaでマイグレーションファイルとスキーマモジュールを作成。 - 生成されたマイグレーションファイルに、
references()で参照先テーブルを記述する。 - 生成されたスキーマモジュールに
belongs_toで参照先スキーマを記述する。(changesetも書き換える。) - 既存の参照先スキーマモジュールに参照元のスキーマを記述する。
となる。