How to Pass a Dynamic Field name in Ash.Query.filter?

How do I dynamically pass a field name in Ash.Query.filter?

In below code, I am trying to filter by a specific attribute only when it is not null or empty string. It is not throwing any error nor is it filtering.

I tried using field/1, ref/1, attribute/1 but they were undefined outside a resource.

How do I make below logic work in Ash?

def filter(query, [department: department, job_title: job_title]) do
     query
     |> maybe_filter(:department_id, department)
     |> maybe_filter(:job_title_id, job_title)
end

 defp maybe_filter(query, _field, ""), do: query
 defp maybe_filter(query, _field, value) when is_nil(value), do: query

# THIS IS WHERE I AM HAVING CHALLENGES
 defp maybe_filter(query, field, value), do: Ash.Query.filter(query, ^field == ^value)

import Ash.Expr to get access to ^ref/1

Here how I changed my codes.

  defp maybe_filter(query, _field, ""), do: query
  defp maybe_filter(query, _field, value) when is_nil(value), do: query

  defp maybe_filter(query, field, value) do
    # Import Ash.Expr to get access to ref
    import Ash.Expr
    Ash.Query.filter(query, ^ref(field) == ^value)
  end
1 Like