2015-11-23 7 views
6

Ich versuche Geo Bibliothek verwenden, um Geo.Point über Phoenix Modell Changeset zu speichern. Meine params sind: {coordinates: [49.44, 17.87]} oder mehr würde {coordinates: {latitude: 49.44, longitude: 17.87}}Wie verwende ich die Geo-Bibliothek, um ein gültiges Ecto-Modell-Changeset zu erstellen?

In iex Konsole bevorzugen sein, die ich versucht:

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], 

Alle anderen durch Poison.Parser Fehler beendet Versuche.

Wie sollte Params von Client-Seite aussehen, um gültige Changeset zu erstellen?

Modell:

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 

Antwort

5

Nach den Tests für die Bibliothek:

https://github.com/bryanjos/geo/blob/351ee6c4f8ed24541c9c2908f615e7b0a238f010/test/geo/ecto_test.exs#L100

Sie benötigen einen Geo.Point auf Ihre changeset Funktion zu übergeben:

changeset = Place.changeset(%Place{}, %{coordinates: %Geo.Point{coordinates: {49.44, 17.87}}) 

Sie können mehr über benutzerdefinierte Ecto-Typen in [den Dokumenten] lesen. (https://hexdocs.pm/ecto/Ecto.Type.html#content)

+0

Können Sie mir sagen, wie ich '{coordinates: {latitude: 49.44, longitude: 17.87}}' '' '' geografische Breite und 'Länge' in '% Geo.Point {}' im richtigen Format abbilden kann? – luzny

+2

'% Geo.Point (Koordinaten: {get_in (coords_map.coordinates.latitude), get_in (coords_map.coordinates.longitude)})' http://elixir-lang.org/docs/stable/elixir/Kernel.html# get_in/2 – Gazler

+0

wenn ich mehr params wie 'coords_map =% {name:" test ", Koordinaten:% {latitude: 49.44, longitude: 17.87}}' Ich möchte% Geo.Point zu Koordinaten param, ist für Es ist ein einfacher Weg? – luzny