使用has_many-使用UUID时属于_关联(字符串)

时间:2019-06-06 10:03:18

标签: elixir phoenix-framework uuid has-many belongs-to

我正在尝试将两个模型(用户和国家/地区)相关联:

·一个国家有很多用户。

·用户属于一个国家/地区。

此外,我将UUID用作这两个模型的主键,所以我没有:id类型来关联它们,而只有字符串可以做到这一点。 这些国家/地区是静态的,但我会创建很多用户。

我应该如何关联这两个模型,并且应该在模式的两个函数(has_many和belongs_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 个答案:

答案 0 :(得分:2)

您可以在belongs_to中传递:type选项:

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