Как вы делаете "Поиск, сортировка, нумерация страниц"?в рамках феникса - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть список контактов клиентов на странице шоу.и он разбит на страницы.

Я хочу добавить поиск и сортировку в этот список.Я искал рыться , но с Phoenix 1.3 это, похоже, не беспокоило.Я получаю сообщение об ошибке во время смешивания deps.get, требующего версии феникса.

И второй вариант - turbo_ecto .но мне трудно разобраться и начать работать.

Я думаю, что поиск и сортировка - это командная функциональность, которую реализует большинство людей.Как ты это делаешь?и как я могу это сделать?

1 Ответ

0 голосов
/ 24 сентября 2018

Прежде чем использовать какой-либо более крупный, сложный и запутанный фреймворк для сортировки / поиска, вы можете развернуть собственное решение.

Поиск

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) и по возрастанию или по убыванию.Это может быть легко расширено для поддержки нескольких ключей сортировки одновременно, если это необходимо.

Оба решения наверняка могут быть в какой-то момент абстрагированы в свои собственные модули / контекстные модули.

...