elixir ecto - 创建和更新之间的变更集差异
elixir ecto - changeset differences between create and update
我有这个 Ecto.Schema
和 changeset
如下:
def changeset(current_case, attrs) do
current_case
|> cast(attrs, [:case_id, :latitude, :longitude, :user_id])
|> cast_coordinates()
end
def cast_coordinates(changeset) do
lat = get_change(changeset, :latitude)
lng = get_change(changeset, :longitude)
geo = %Geo.Point{coordinates: {lng, lat}, srid: 4326}
changeset |> put_change(:coordinates, geo)
end
基本上,它是一个简单的 table,包含 case_id
、latitude
、longitude
、user_id
。
偶尔,用户会更新他们的位置,但有时,他们只更新 case_id
而没有更新位置。
cast_coordinates
会把latitude
和longitude
转换成geo point
然后输入到changeset
.
当 create/1
时,我不会有问题,因为 changeset
中的 changes
将拥有所有数据。
但是当update/2
时,如果我只想更新,我会得到argument error
:
仅 latitude
,因为 changes
中的 longitude
将是 nil
.
仅 longitude
,因为 changes
中的 latitude
将是 nil
.
- 没有位置更新,因为两者都是
nil
。
- 我什至无法从
current_case
强行注入 latitude
或 longitude
,变更集会将它们视为无变更,因此该值将是 nil
。
我该如何解决这个问题?
使用get_field/3 instead of get_change/3.
get_change/3
仅获取更改,因此如果 attrs
不包括纬度或经度,它将 return nil
.
get_field/3
从数据中提取 或 的变化。更新时,来自 current_case
的数据应包含当前纬度和经度值,这些值将被 returned 而不是 nil
。
我有这个 Ecto.Schema
和 changeset
如下:
def changeset(current_case, attrs) do
current_case
|> cast(attrs, [:case_id, :latitude, :longitude, :user_id])
|> cast_coordinates()
end
def cast_coordinates(changeset) do
lat = get_change(changeset, :latitude)
lng = get_change(changeset, :longitude)
geo = %Geo.Point{coordinates: {lng, lat}, srid: 4326}
changeset |> put_change(:coordinates, geo)
end
基本上,它是一个简单的 table,包含 case_id
、latitude
、longitude
、user_id
。
偶尔,用户会更新他们的位置,但有时,他们只更新 case_id
而没有更新位置。
cast_coordinates
会把latitude
和longitude
转换成geo point
然后输入到changeset
.
当 create/1
时,我不会有问题,因为 changeset
中的 changes
将拥有所有数据。
但是当update/2
时,如果我只想更新,我会得到argument error
:
-
仅
latitude
,因为changes
中的longitude
将是nil
.
仅 longitude
,因为changes
中的latitude
将是nil
.- 没有位置更新,因为两者都是
nil
。 - 我什至无法从
current_case
强行注入latitude
或longitude
,变更集会将它们视为无变更,因此该值将是nil
。
我该如何解决这个问题?
使用get_field/3 instead of get_change/3.
get_change/3
仅获取更改,因此如果 attrs
不包括纬度或经度,它将 return nil
.
get_field/3
从数据中提取 或 的变化。更新时,来自 current_case
的数据应包含当前纬度和经度值,这些值将被 returned 而不是 nil
。