Something like this… (it’s related to a User)
def list_users_query(criteria \\ []) do
query = from p in User
Enum.reduce(criteria, query, fn
{:limit, limit}, query ->
from p in query, limit: ^limit
{:offset, offset}, query ->
from p in query, offset: ^offset
{:filter, filters}, query ->
filter_with(filters, query)
{:order, order}, query ->
from p in query, order_by: [{^order, ^@order_field}]
{:preload, preloads}, query ->
from p in query, preload: ^preloads
arg, query ->
Logger.info("args is not matched in query #{inspect arg}")
query
end)
end
defp filter_with(filters, query) do
Enum.reduce(filters, query, fn
{:name, name}, query ->
pattern = "%#{name}%"
from q in query, where: ilike(q.name, ^pattern)
end)
end
Then You could do…
iex> Accounts.list_users filter: [name: "dmi"], limit: 1