我有一个保存用户latitude和longitude的locations表。我正在使用带有扩展的Postgres/Postgis 13来生成坐标。下面是我的模型:
schema "locations" do
field :latitude, :float
field :longitude, :float
field :context, :string
field :publish, :boolean
field :coordinates, Geo.PostGIS.Geometry
belongs_to(:user, User)
timestamps()
end
@doc false
def changeset(location, attrs) do
location
|> cast(attrs, [:user_id, :context, :longitude, :latitude, :publish])
|> validate_required([:user_id, :context, :longitude, :latitude])
|> cast_coordinates()
end
@spec cast_coordinates(Ecto.Changeset.t()) :: Ecto.Changeset.t()
def cast_coordinates(changeset) do
IO.inspect(changeset)
lat = get_change(changeset, :latitude)
lng = get_change(changeset, :longitude)
geo = %Geo.Point{coordinates: {lng, lat}, srid: 4326}
changeset |> put_change(:coordinates, geo)
endwhen I create_location
def create_location(attrs \\ %{}) do
IO.inspect(attrs)
%Location{}
|> Location.changeset(attrs)
|> Repo.insert()
end一切都很顺利。cast_coordinates中的changeset为:
cast coordinate
#Ecto.Changeset<
action: nil,
changes: %{
context: "sss shop",
latitude: 38.115556,
longitude: 13.361389,
profile_id: 5,
publish: true,
user_id: 2
},
errors: [],
data: #OkBackend.Gis.ProfileLocation<>,
valid?: true
>但是当我update_location的时候
def update_location(%Location{} = location, attrs) do
location
|> Location.changeset(attrs)
|> Repo.update()
end不知何故,我的cast_coordinate抛出了argument error,因为changeset是:
#Ecto.Changeset<action: nil, changes: %{}, errors: [],
data: #OkBackend.Gis.ProfileLocation<>, valid?: true>正如您所看到的,changes中没有任何内容。
为什么会这样呢?我该如何解决这个问题呢?
发布于 2021-10-24 14:20:08
我认为这可能是因为在您的cast_coordinates函数中,您正在使用get_change(changeset, :longitude)。
这将得到一个指向longitude字段的change,但是如果您不更改该字段,那么它将返回nil。
相反,您应该使用get_field(changeset, :longitude)来获取更改后的经度或现有的经度(如果它没有更改),如下所示:
@spec cast_coordinates(Ecto.Changeset.t()) :: Ecto.Changeset.t()
def cast_coordinates(changeset) do
lat = get_field(changeset, :latitude)
lng = get_field(changeset, :longitude)
geo = %Geo.Point{coordinates: {lng, lat}, srid: 4326}
changeset |> put_change(:coordinates, geo)
endhttps://stackoverflow.com/questions/69674264
复制相似问题