在Ecto中按方向和列名自定义排序

时间:2017-05-23 04:12:37

标签: sql elixir phoenix-framework ecto

在第一行中,我通过对方向和列名称进行硬编码来设置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"

1 个答案:

答案 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
相关问题