elixir - 您如何进行“搜索、排序、分页”?在凤凰框架中
问题描述
我在显示页面中有客户联系人列表。它是分页的。
我想在这个列表中添加搜索和排序。我正在寻找rummage,但它似乎不适用于 phoenix 1.3。混合 deps.get 时出现错误,抱怨需要 phoenix 版本。
第二个选项是turbo_ecto。但我很难理解和运行。
我认为搜索和排序是大多数人实现的命令功能。你怎么做到这一点?我该怎么做?
解决方案
在使用任何更大、更复杂、更混乱的框架进行排序/搜索之前,您可以推出自己的解决方案。
搜索
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
)和升序或降序进行排序。如果需要,这可以很容易地扩展为同时支持多个排序键。
两种解决方案都可以在某个时候抽象为它们自己的模块/上下文模块。
推荐阅读
- python - 我们如何在 Gitpod 中使用项目中的预安装虚拟环境 & 在项目中放置虚拟环境可以吗?
- flutter - 如何在抖动时(以太币到任何其他货币)时更改默认货币
- amazon-web-services - SQL Cookie 规则标记
- ajax - SP 2013 - 试图从列表中获取项目 - 有人说未定义
- android - ImageView 可点击,Webview 和 php
- css - 显示本机输入元素的角垫输入
- .net - 在表上引入 FOREIGN KEY 约束可能会导致循环或多个级联路径,如何解决?
- sql - 优化给定的 sql 查询以提高速度
- rascal - 可能的错误?在具有函数大小的列表列表上使用映射器
- r - 以 R 格式打印一个值和格式大小和颜色