elixir ecto - 创建和更新之间的变更集差异

elixir ecto - changeset differences between create and update

我有这个 Ecto.Schemachangeset 如下:

  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_idlatitudelongitudeuser_id

偶尔,用户会更新他们的位置,但有时,他们只更新 case_id 而没有更新位置。

cast_coordinates会把latitudelongitude转换成geo point然后输入到changeset.

create/1 时,我不会有问题,因为 changeset 中的 changes 将拥有所有数据。

但是当update/2时,如果我只想更新,我会得到argument error

  1. latitude,因为 changes 中的 longitude 将是 nil.
  2. longitude,因为 changes 中的 latitude 将是 nil.
  3. 没有位置更新,因为两者都是 nil
  4. 我什至无法从 current_case 强行注入 latitudelongitude,变更集会将它们视为无变更,因此该值将是 nil

我该如何解决这个问题?

使用get_field/3 instead of get_change/3.

get_change/3 仅获取更改,因此如果 attrs 不包括纬度或经度,它将 return nil.

get_field/3 从数据中提取 的变化。更新时,来自 current_case 的数据应包含当前纬度和经度值,这些值将被 returned 而不是 nil