在第一行中,我通过对方向和列名称进行硬编码来设置order_by
子句。
order_by = [desc: :inserted_at]
results =
from t in Transmission,
where: ilike(t.name, ^"%#{params["term"]}%"),
order_by: ^order_by
如何动态设置这些? UX是用户单击表列标题并更改该特定字段的排序顺序。
无法在文档中找到任何内容:https://hexdocs.pm/ecto/Ecto.Query.html#order_by/3
想象一下,我的控制器中的params对象有这两个变量:
sort = "asc"
field_name = "inserted_at"
答案 0 :(得分:4)
sort = "asc"
field_name = "inserted_at"
order_by = [{String.to_atom(sort), String.to_atom(field_name)}]
或
order_by = [{:"#{sort}", :"#{field_name}"}]
甚至
[[sort, field_name]
|> Enum.map(&String.to_atom/1)
|> List.to_tuple]
#⇒ [asc: :inserted_at]
在幕后,关键字是一个元组列表,每个元组都有两个元素。
iex(1)> [a: 42] == [{:a, 42}]
true