acrolink

acrolink

How to pass "asc" or "desc" to the Ecto.query function

I have created some basic select list (asc, desc). I want to pass either strings to Ecto.query.

# order by order_by_expires
def order_by_expires(query, nil), do: query
def order_by_expires(query, direction) do
  query |> order_by(direction: :expires)
end

The above does not work, I get the error:

Ecto.Query.CompileError) expected :asc, :desc or interpolated value in order_by, got: :direction

Marked As Solved

t0t0

t0t0

I think you need to write:

order_by({direction, :expires})

Else direction: is the atom :direction.

I guess direction has to be converted to atom first:

if direction in ~W[asc desc], do: String.to_existing_atom(direction), else: :asc

Or much better, do pattern matching on direction:

defp do_order_by_expires(query, direction) do
    query |> order_by({direction, :expires})
end

def order_by_expires(query, "desc") do
  do_order_by_expires(query, :desc)
end

def order_by_expires(query, _) do
  do_order_by_expires(query, :asc)
end

Also Liked

josevalim

josevalim

Creator of Elixir

Move the assignment out of the if:

def order_by_expires(query, direction) do
  direction = if direction in ~W[asc desc], do: String.to_existing_atom(direction), else: :asc
  query |> order_by({^direction, :expires})
end

You can also simplify it to:

def order_by_expires(query, direction) do
  direction = if direction == "desc", do: :desc, else: :asc
  query |> order_by({^direction, :expires})
end
acrolink

acrolink

A little modification was needed to get it to work:

defp do_order_by_expires(query, direction) do
    query |> order_by({^direction, :expires})
end

Thank you.

Where Next?

Popular in Questions Top

yawaramin
In the Dialyzer docs ( http://erlang.org/doc/man/dialyzer.html#requesting-or-suppressing-warnings-in-source-files ), there is a way to tu...
New
New
dokuzbir
Hello, I am trying to convert my lists to string without losing brackets.For start i have 3 map. They look like these buyer = %{ id: ...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
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
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
Exadra37
Sometimes I want to check if the input into a function is not a blank string. My first approach: defmodule Example do def do_stuff(s...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New

Other popular topics Top

JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1140 51847 244
New
yawaramin
In the Dialyzer docs ( http://erlang.org/doc/man/dialyzer.html#requesting-or-suppressing-warnings-in-source-files ), there is a way to tu...
New
ycv005
I have followed this StackOverflow post to install the specific version of Erlang. And When I am running mix ecto.setup then getting fol...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list....
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
lucidguppy
I have a super simple question about elixir - how would I take a file like this foo bar baz and output a new file that enumerates th...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New

We're in Beta

About us Mission Statement