你怎么做“搜索、排序、分页”?在凤凰框架中

Tae*_*Tae 3 elixir phoenix-framework

我在显示页面中有客户联系人列表。它是分页的。

我想在这个列表中添加搜索和排序。我正在研究rummage,但似乎不担心 phoenix 1.3。我在混合 deps.get 时遇到错误,抱怨需要凤凰版本。

第二个选项是turbo_ecto。但我很难理解和运行。

我认为搜索和排序是大多数人实现的命令功能。你怎么做到这一点?我该怎么做?

Jon*_*ger 5

在使用任何更大、更复杂、更令人困惑的框架进行排序/搜索之前,您可以推出自己的解决方案。

搜索

Ecto 提供ilike/2like/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
Run Code Online (Sandbox Code Playgroud)

注意,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
Run Code Online (Sandbox Code Playgroud)

此解决方案允许按一个键(需要包含在 中@sort_keys)以及升序或降序进行排序。如果需要,这可以很容易地扩展到同时支持多个排序键。

这两种解决方案肯定可以在某个时候抽象到它们自己的模块/上下文模块中。