Elixir 的 Ecto 中 varchar(custom_size) 的 PostgreSQL 数组

A PostgreSQL array of varchar(custom_size) in Elixir's Ecto

我有一个这样的 Ecto 模式:

schema "quotes" do
  field :quote, :string
  field :tags, {:array, :string}

  timestamps()
end

在相应的迁移中有:

create table(:quotes) do
  add :quote, :string, size: 145
  add :tags, {:array, :string}

  timestamps()
end

我希望 tags 中的每个标签的最大大小为 140。如何在迁移中指定此约束?我的目标是在生成的 PostgreSQL table 中有一个 varchar(140) 的数组,而不是更多的 'spacy' 默认值(255?)。

add 接受任何原子作为列类型并将其按原样传递给适配器,PostgreSQL 适配器按原样将未知类型发送给数据库,这意味着我们可以指定确切的类型,即varchar(140)作为{:array, _}的第二个元素,只要是一个原子即可。

add :tags, {:array, :"varchar(140)"}

我已经对此进行了测试,运行 迁移正确地创建了所需类型的列。

my_app_dev=# \d posts
                                  Table "public.posts"
  Column  |           Type           |                     Modifiers
----------+--------------------------+---------------------------------------------------
 ...
 tags     | character varying(140)[] |

schema 中无需更改任何内容。那里的类​​型应该保持 {:array, :string}.