Nested validation for related children

How would you do nested validation for related children?

I want to validate field options under field 1 against field options in field 2.

Show validation message in field option 1 if field option 1 attribute value is not in field option 4/5/6.

  • Field 1

    • Field Option 1 - hello
      • error: value hello is not in field option 4/5/6
    • Field Option 2 - foo
    • Field Option 3 - bar
  • Field 2

    • Field Option 4 - foo
    • Field Option 5 - bar
    • Field Option 6 - baz
defmodule Helpdesk.FieldOption do
  use Ash.Resource, otp_app: :helpdesk

  actions do
    defaults [:read, create: [:name]]

    update :update do
      primary? true
      accept [:name]

      require_atomic? false
    end

  end

  attributes do
    uuid_primary_key :id

    attribute :name, :string do
      allow_nil? false
      public? true
    end

    timestamps()
  end

  relationships do
    belongs_to :form_field, Helpdesk.FormField
  end

  validations do
    validate fn changeset, context ->
      # ???
      :ok
    end
  end
end

Are the users modifying the related information in the action? Because if you want to validate related data like this your best bet would likely be to do it in an after_action. i.e

defmodule ValidateChildren do
  use Ash.Resource.Change

  def change(changeset, _, _) do
    Ash.Changeset.after_action(changeset, fn changeset, result -> 
      children = Ash.load!(result, :children).children
      if something_is_wrong(...) do
       {:error, Ash.Error.set_path(Ash.Error.Invalid.InvalidChanges.exception(...), [:children, 0])}
     else
       {:ok, result}
     end
    end)
  end
end

change ValidateChildren

I’m just showing a collection of tools you have to do this kind of thing above, thats not a complete example as I’m pretty slammed at the moment :slight_smile: