如何使用 Geo 库创建有效的 Ecto 模型变更集?
How to use Geo library to create valid Ecto Model changeset?
我正在尝试使用 Geo 库通过 Phoenix 模型变更集存储 Geo.Point。我的参数是:{coordinates: [49.44, 17.87]}
或更喜欢 {coordinates: {latitude: 49.44, longitude: 17.87}}
在 iex 控制台我试过:
iex(5)> changeset = Place.changeset(%Place{}, %{coordinates: [49.44, 17.87]})
%Ecto.Changeset{action: nil, changes: %{}, constraints: [],
errors: [coordinates: "is invalid"], filters: %{}
model: %Myapp.Place{__meta__: #Ecto.Schema.Metadata<:built>,
coordinates: nil, id: nil, inserted_at: nil, updated_at: nil}, optional: [],
opts: [], params: %{"coordinates" => [49.445614899999995, 17.875574099999998]},
repo: nil, required: [:coordinates],
所有其他尝试因 Poison.Parser 个错误而结束。
应该如何从客户端查看参数以创建有效的变更集?
型号:
defmodule MyApp.Place do
use MyApp.Web, :model
schema "place" do
field :coordinates, Geo.Point
timestamps
end
@required_fields ~w(coordinates)
@optional_fields ~w()
def changeset(model, params \ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
end
end
根据图书馆的测试:
您需要将 Geo.Point 传递给您的变更集函数:
changeset = Place.changeset(%Place{}, %{coordinates: %Geo.Point{coordinates: {49.44, 17.87}})
您可以在[文档]中阅读更多关于自定义 ecto 类型的信息。(https://hexdocs.pm/ecto/Ecto.Type.html#content)
对于未来的 reader,还有 geo_postgis
,由同一作者基于 geo
,它是一个 postgrex 扩展并与 ecto 一起工作。
我正在尝试使用 Geo 库通过 Phoenix 模型变更集存储 Geo.Point。我的参数是:{coordinates: [49.44, 17.87]}
或更喜欢 {coordinates: {latitude: 49.44, longitude: 17.87}}
在 iex 控制台我试过:
iex(5)> changeset = Place.changeset(%Place{}, %{coordinates: [49.44, 17.87]})
%Ecto.Changeset{action: nil, changes: %{}, constraints: [],
errors: [coordinates: "is invalid"], filters: %{}
model: %Myapp.Place{__meta__: #Ecto.Schema.Metadata<:built>,
coordinates: nil, id: nil, inserted_at: nil, updated_at: nil}, optional: [],
opts: [], params: %{"coordinates" => [49.445614899999995, 17.875574099999998]},
repo: nil, required: [:coordinates],
所有其他尝试因 Poison.Parser 个错误而结束。
应该如何从客户端查看参数以创建有效的变更集?
型号:
defmodule MyApp.Place do
use MyApp.Web, :model
schema "place" do
field :coordinates, Geo.Point
timestamps
end
@required_fields ~w(coordinates)
@optional_fields ~w()
def changeset(model, params \ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
end
end
根据图书馆的测试:
您需要将 Geo.Point 传递给您的变更集函数:
changeset = Place.changeset(%Place{}, %{coordinates: %Geo.Point{coordinates: {49.44, 17.87}})
您可以在[文档]中阅读更多关于自定义 ecto 类型的信息。(https://hexdocs.pm/ecto/Ecto.Type.html#content)
对于未来的 reader,还有 geo_postgis
,由同一作者基于 geo
,它是一个 postgrex 扩展并与 ecto 一起工作。