我在显示页面上有客户联系人列表。 它是分页的。
我想在此列表中添加搜索和排序。 我一直在研究rummage,但似乎对phoenix 1.3并不担心。我在混合deps时遇到错误,得到抱怨的凤凰版本。
第二个选项是turbo_ecto。但是我很难理解和启动它。
我认为搜索和排序是大多数人实现的命令功能。 你怎么做到这一点?以及我该怎么做?
答案 0 :(得分:3)
在使用任何更大,更复杂,更混乱的框架进行排序/搜索之前,您可以推出自己的解决方案。
Ecto提供了ilike/2和like/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
# 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
中)进行升序或降序排序。如果需要,可以轻松地扩展它以同时支持多个排序键。
两个解决方案肯定都可以在某个时候抽象到它们自己的模块/上下文模块中。