我正在尝试将两个模型(用户和国家/地区)相关联:
·一个国家有很多用户。
·用户属于一个国家/地区。
此外,我将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
答案 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
。