Выборочная проверка приводит к вставке / 4 - PullRequest
0 голосов
/ 25 января 2020

Я не понимаю, почему я получаю эту ошибку:

Abc.Maps.Location.create_location(%{name: "USA", is_country: true})
** (FunctionClauseError) no function clause matching in Ecto.Repo.Schema.insert/4 

Я понимаю, что нет insert/4, но я не понимаю, почему validate_presents_of_parent/1 создает проблему в первую очередь. В чем моя ошибка?

Я хочу подтвердить, что parent_location существует, если location не является страной.

defmodule Abc.Maps.Location do
  use Ecto.Schema
  import Ecto.Changeset

  schema "locations" do
    field(:is_country, :boolean, default: false)
    field(:is_federal_state, :boolean, default: false)
    field(:name, :string)
    belongs_to :parent_location, Abc.Maps.Location

    timestamps()
  end

  @doc false
  def changeset(location, attrs) do
    location
    |> cast(attrs, [
      :name,
      :is_country,
      :is_federal_state,
      :parent_location_id
    ])
    |> validate_required([:name])
    |> validate_presents_of_parent()
  end

  def validate_presents_of_parent(changeset) do
    # Only a country doesn't have a parent.
    unless get_field(changeset, :is_country) do
      assoc_constraint(changeset, :parent_location)
    end
  end
end

1 Ответ

1 голос
/ 25 января 2020

Похоже, что вы забыли вернуть (неизменный) набор изменений из validate_presents_of_parent, когда :is_country имеет значение true. И вам нужно подтвердить для :parent_location_id тоже.

  def validate_presents_of_parent(changeset) do
    # Only a country doesn't have a parent.
    if get_field(changeset, :is_country) do
      changeset
    else
      changeset
      |> validate_required([:parent_location_id])
      |> assoc_constraint(:parent_location)
    end
  end
...