在Ecto模式中,可以使用@primary_key
属性来指定自动生成的主键:
@primary_key {:id, :binary_id, autogenerate: true}
是否可以为autogenerate
指定自定义函数?我相信在这种情况下,它将使用Ecto.UUID.generate
,而我想使用v1 UUID。
答案 0 :(得分:0)
根据the official documentation,您可以创建自己的自定义主键。
以下是将name
设置为主键的简单示例:
假设我们使用以下混合任务生成了Player
表:
mix phoenix.gen.json Player players name:string position:string number:integer
在迁移中,将create table
设置为primary_key: false
并将primary_key: true
添加到名称字段:
def change do
create table(:players, primary_key: false) do
add :name, :string, primary_key: true
add :position, :string
add :number, :integer
timestamps
end
end
然后在您的架构中,您要做的就是告诉Ecto主键现在是一个字符串(@primary_key {:name, :string, []}
),并且要使用的ID(例如,在路由中)将为{{1} } name
。另外,请不要忘记删除@derive {Phoenix.Param, key: :name}
。
field :name, :string
在这种情况下,您可以做的是将自己的字段设置为主键,然后在将数据持久存储在数据库中时,使用一种使用v1 UUID生成ID的方法将其填充到变更集中。
您可以利用具有UUID v1方法的the UUID package。
不确定这是否是最佳的解决方法,但希望对您有所帮助:)