unlogic

unlogic

Question about Ecto dynamic and sortby

I’m trying to add a sort feature to an API which allows the user to pass the field name to sort by. I figured I could use dynamics as per Dynamic queries — Ecto v3.14.0 but I run into an issue when adding the sort order specifier. this works fine:

dynamic([q], field(q, ^String.to_atom(sortby)))

this however gives an error

dynamic([q], desc: field(q, ^String.to_atom(sortby)))

** (Ecto.Query.CompileError) Tuples can only be used in comparisons with literal tuples of the same size

In order to get this working now I’ve used order_by instead of dynamic

order_by(query, [q], desc: field(q, ^String.to_atom(sortby)))

Which works, but I’d like to understand why the dynamic isn’t working for me, as it’s pretty much the same as in the documentation

Marked As Solved

LostKobrakai

LostKobrakai

So the problem is that the keyword syntax is special to the order_by macro. dynamic allows you to capture sql (query…) expressions. desc: field is not a query expression on it’s own, though. The keyword syntax is just a convenience to use elixir syntax with order_by. If you need to put the direction in the dynamic use plain sql possibly with an fragment.

def dynamic_order_expr(field, :asc), 
  do: dynamic([q], fragment("? ASC", field(q, ^field)))

def dynamic_order_expr(field, :desc), 
  do: dynamic([q], fragment("? DESC", field(q, ^field)))

Also Liked

LostKobrakai

LostKobrakai

Oh, that’s interesting. Maybe this is actually supposed to work (which I wouldn’t have expected). Please open an issue on ectos github, so either docs or the bug can be fixed.

Where Next?

Popular in Questions Top

vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
Lily
In templates/appointment/index.html.eex: <%= for appointment <- @appointments do %> <tr> <td><%= appoi...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New

Other popular topics Top

minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
AstonJ
Posting this to see if we can make things easier for people to get into Neovim. If you use Neovim and have a favourite distro please let ...
New

We're in Beta

About us Mission Statement