如何使用Ecto和Postgres存储数组

54
我希望使用Ecto和Postgres来存储浮点数值数组。 我正在使用Phoenix框架和Elixir。
我该如何定义我的模型和迁移呢?
除了在网上搜索,我还没有尝试过其他方法,但是没有找到有用的信息 :-(。
我确实尝试过使用类似以下结构的模式定义模型:
  schema "my_model" do
    field :my_array, :array

    timestamps
  end

出现了错误:“无效或未知类型: my_array 字段的数组类型”

2个回答

76

我在这里的Ecto.Schema原始类型列表中找到了答案:

Ecto.Schema

答案是像这样定义类型:

  schema "my_model" do
    field :my_array, {:array, :float}

    timestamps
  end

9
谢谢,你会如何书写迁移代码? - neildaemond
15
以下是翻译的结果:这是一个生成器示例:mix phx.gen.schema Blog.Post blog_posts tags:array:string。它可以用于 Phoenix 框架中创建一个名为 "Blog.Post" 的模式,并在其中包含一个名为 "tags" 的字符串数组字段。 - Sash
2
来自@sash的示例生成了一个具有相关行add:tags,{:array,:string}的迁移。 - wodow

48

请使用Josh提到的Ecto.Schema中的数组类型。

在模型中:

schema "my_model" do
  field :my_array, {:array, inner_type}
end

@neildaemond 迁移:

alter table(:my_models) do
  add :my_array, {:array, inner_type}
end

使用一个有效的类型,例如:string来替换inner_type

您也可以使用map类型执行相同的操作:

schema "my_model" do
  field :my_map, {:map, inner_type}
end

3
有没有什么好的方法来正确构建一个表单,让用户可以输入这个数组或映射的元素? - pmarreck
@pmarreck,你看过表单文档吗?https://hexdocs.pm/phoenix_html/Phoenix.HTML.Form.html 我通常开发API应用,所以不使用表单,无法提供帮助。 - Bartłomiej Skwira
我有,但在这种情况下没有看到任何有用的东西。 - pmarreck
@pmarreck 这篇帖子似乎很相关。 - xji

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接