2017-05-23 6 views
0

最初の行では、方向と列名をハードコーディングしてorder_by節を設定しています。Ectoの方向と列名によるカスタムソート

order_by = [desc: :inserted_at] 
results = 
    from t in Transmission, 
    where: ilike(t.name, ^"%#{params["term"]}%"), 
    order_by: ^order_by 

どのようにこれらを動的に設定できますか? UXは、ユーザーがテーブルの列見出しをクリックして、その特定のフィールドの並べ替え順序を変更するユーザーです。

は、ドキュメントに何かを見つけることができませんでした:

sort = "asc" 
field_name = "inserted_at" 

答えて

2
sort = "asc" 
field_name = "inserted_at" 

order_by = [{String.to_atom(sort), String.to_atom(field_name)}] 

または

order_by = [{:"#{sort}", :"#{field_name}"}] 

https://hexdocs.pm/ecto/Ecto.Query.html#order_by/3

は、私は私のコントローラ内のparamsオブジェクトからこれらの2つの変数を持っている想像してみてまたはさらに

[[sort, field_name] 
|> Enum.map(&String.to_atom/1) 
|> List.to_tuple] 
#⇒ [asc: :inserted_at] 

フードの下では、キーワードは2つの要素を持つタプルのリストです。

+0

しかし、原子が決して削除/ガベージコレクションされないため、ユーザーの入力に基づいてアトムを作成することは一般的に悪い習慣とみなされます。入力が ':asc' /':desc'または既存のフィールドであると期待するときは、おそらく 'Atom.to_existing_atom'を使用する方が良いでしょう。 –

関連する問題