如何自定义Phoenix的id

时间:2016-02-17 02:57:45

标签: elixir phoenix-framework

使用phoenix框架,将自动生成:id, :integerhttp://www.phoenixframework.org/docs/ecto-custom-primary-keys

但我希望它不会自动生成并使用自定义ID字段,例如:id, :string,就像这样 http://ruby-journal.com/how-to-override-default-primary-key-id-in-rails/

设置

defmodule MyApp.Item do
  use MyApp.Web, :model

  # @primary_key {:id, :id, autogenerate: false}
  schema "items" do
    field :id, :string, autogenerate: false # some unique id string
    field :type, :integer

它引发了** (ArgumentError) field/association :id is already set on schema https://github.com/elixir-lang/ecto/blob/db1f9ccdcc01f5abffcab0b5e0732eeecd93aa19/lib/ecto/schema.ex#L1327

1 个答案:

答案 0 :(得分:10)

我遇到了两个问题。

  1. @primary_key {:id, :id, autogenerate: false}fields :id子句都不能在模式定义中。
  2. 这是解决方案

    defmodule MyApp.Item do
      use MyApp.Web, :model
    
      @primary_key {:id, :string, []}
      schema "items" do
        # field :id, :string <- no need!
    
    1. 为了避免自动生成的ID,我只需编辑迁移文件
    2. 喜欢这个

      defmodule MyApp.Repo.Migrations.CreateItem do
        use Ecto.Migration
      
        def change do
          create table(:items, primary_key: false) do
            add :id, :string, primary_key: true
      

      最后,我可以执行mix ecto.migrate并可以获得下面的表格定义

      mysql> SHOW CREATE TABLE items;
      | items | CREATE TABLE `builds` (
        `id` varchar(255) NOT NULL,
      

      官方文件肯定会说明这一点 http://www.phoenixframework.org/docs/ecto-custom-primary-keys

        

      让我们首先看看迁移,priv / repo / migrations / 20150908003815_create_player.exs。我们需要做两件事。第一个是将第二个参数 - primary_key:false传递给table / 2函数,以便它不会创建primary_key。然后我们需要将primary_key:true传递给name字段的add / 3函数,以表示它将是primary_key。

      但是一开始,您不想要列id,您只需要迁移create table(:items, primary_key: false),并编辑架构

      defmodule MyApp.Item do
        use MyApp.Web, :model
      
        # @primary_key {:id, :string, []}
        @primary_key false # to avoid unnecessary IO scanning
        schema "items" do
          # field :id, :string <- no need!
      

      虽然自我解决,但无论如何,谢谢