Прежде чем использовать какой-либо более крупный, сложный и запутанный фреймворк для сортировки / поиска, вы можете развернуть собственное решение.
Поиск
Ecto предоставляет илик / 2 и подобно / 2 .Простое полнотекстовое решение может выглядеть следующим образом:
# In your Customer Controller
def index(conn, params = %{"name_search" => name_search}) do
customers = Repo.all(from c in Customer,
where: like(c.name, ^"%#{name_search}%"))
# render customers
end
Обратите внимание, ilike/2
поддерживается только postgresql.Кроме того, это может привести к атакам типа LIKE, поскольку вы позволяете пользователю вводить символы подстановки.Входные данные можно легко санировать, следуя этому руководству: LIKE Injection
Сортировка
Можно также выполнить сортировку с использованием order_by / 3
# Extending your customer controller
# May want to transfer some of this logic to its own or context module
@sort_keys ~w(name email)
def index(conn, params = %{"name_search" => name_search,
"sort_key" => sort_key, "sort_type" => sort_type}) do
sort_type =
case sort_type do
"asc" -> :asc
_ -> :desc
end
sort_key =
Enum.find(@sort_keys, "name", &(&1 == sort_key))
|> String.to_atom
customers = Repo.all(from c in Customer,
where: like(c.name, ^"%#{name_search}%")),
order_by: [{sort_type, sort_key}]
# render customers
end
Это решение позволяет сортировать по одному ключу (который должен содержаться в @sort_keys
) и по возрастанию или по убыванию.Это может быть легко расширено для поддержки нескольких ключей сортировки одновременно, если это необходимо.
Оба решения наверняка могут быть в какой-то момент абстрагированы в свои собственные модули / контекстные модули.