Использование has_many - ассоциация own_to при использовании UUID (String) - PullRequest
2 голосов
/ 06 июня 2019

Я пытаюсь связать две модели (пользователь и страна), где:

· Страна имеет_ многих пользователей.

· Пользователь принадлежит_ к одной стране.

ТакжеЯ использую UUID в качестве первичного ключа для двух моделей, поэтому у меня нет типа: id, чтобы связать их, и есть только строки для этого.Страны статичны, но я создам много пользователей.

Как мне соотнести эти две модели и какие параметры я должен записать в две функции в схемах (has_many & own_to)?И какую функцию я должен вызвать, чтобы связать их: cast_assoc, build_assoc или put_assoc?

Спасибо !!

  @primary_key {:uuid, :string, []}
  @derive {Phoenix.Param, key: :uuid}
  schema "countries" do
    field :country_name, :string

    has_many :users, UserManagement.User, foreign_key: :country_id
  end
  @primary_key {:uuid, :string, []}
  @derive {Phoenix.Param, key: :uuid}
  schema "users" do
    field :nickname, :string
    field :password, :string, virtual: true

    belongs_to :country, UserManagement.Country, references: :uuid

    timestamps()
  end

1 Ответ

2 голосов
/ 06 июня 2019

Вы можете передать опцию: type в belongs_to:

belongs_to :country, UserManagement.Country, references: :uuid, type: :string

И все функции ассоциации и помощники должны работать. Вы можете найти все доступные варианты здесь: https://hexdocs.pm/ecto/Ecto.Schema.html#belongs_to/3


Если вы хотите, чтобы все ваши схемы использовали UUID, вы можете инкапсулировать установку в пользовательский модуль, например так:

defmodule MyApp.Schema do
  defmacro __using__(_) do
    quote do
      use Ecto.Schema
      @primary_key {:uuid, :string, []}
      @foreign_key_type :string
      @derive {Phoenix.Param, key: :uuid}
    end
  end
end

А теперь вместо use Ecto.Schema вы делаете use MyApp.Schema.

...