在ecto中自定义主键自动生成功能?

时间:2019-04-08 14:14:02

标签: elixir phoenix-framework ecto

在Ecto模式中,可以使用@primary_key属性来指定自动生成的主键:

@primary_key {:id, :binary_id, autogenerate: true}

是否可以为autogenerate指定自定义函数?我相信在这种情况下,它将使用Ecto.UUID.generate,而我想使用v1 UUID。

1 个答案:

答案 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

不确定这是否是最佳的解决方法,但希望对您有所帮助:)