Elixir Using has_many-在使用UUID(字符串)时属于关联

Elixir Using has_many-在使用UUID(字符串)时属于关联,elixir,phoenix-framework,uuid,has-many,belongs-to,Elixir,Phoenix Framework,Uuid,Has Many,Belongs To,我试图将两个模型(用户和国家)关联起来,其中: ·一个国家有很多用户 ·用户属于一个国家/地区 另外,我使用UUID作为这两个模型的主键,因此我没有:id类型来关联它们,只有字符串来关联它们。 国家是静态的,但我会创建很多用户 我应该如何将这两个模型联系起来,以及我应该在模式中的两个函数中写入哪些参数(has_many&归属)?我应该调用哪个函数来关联它们:cast\u assoc、build\u assoc或put\u assoc 谢谢 @primary_key {:uuid, :stri

我试图将两个模型(用户和国家)关联起来,其中:

·一个国家有很多用户

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

另外,我使用UUID作为这两个模型的主键,因此我没有:id类型来关联它们,只有字符串来关联它们。 国家是静态的,但我会创建很多用户

我应该如何将这两个模型联系起来,以及我应该在模式中的两个函数中写入哪些参数(has_many&归属)?我应该调用哪个函数来关联它们:cast\u assoc、build\u assoc或put\u 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

您可以在
所属的
中传递:type选项:

belongs_to :country, UserManagement.Country, references: :uuid, type: :string
所有的协会职能和助手都应该发挥作用。您可以在此处找到所有可用选项:


如果希望所有模式都使用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

现在,如果您使用的是Jose Valim提供的公认答案,并且您还在自定义模式
@primary\u key
上设置了
autogenerate:true
,而不是
使用异位.Schema
,那么您确实需要
MyApp.Schema
模块使用type
异位.UUID

这看起来像:

@primary_key {:uuid, Ecto.UUID, autogenerate: true}
如果没有,使用此基本架构的架构将抛出
(ArgumentError)字段:uuid不支持:autogenerate,因为它使用了一个基本类型:string

,非常感谢!这个“用法”实现起来也很有趣!
@primary_key {:uuid, Ecto.UUID, autogenerate: true}