How to check data returned from Ecto

I have no idea how to write condition code.
If I try to get member (id = 10), then no member, I would like to member (id = 9).
How can I write if condition?

  def index(conn, _params) do
    member_id = 10
    member = App.get_member(member_id)
   # BAD CODE
   if (member is nill){
      member = App.get_member(member_id - 1)
   }
    
    render(conn, "index.html", [member : member ])
  end
  def get_member(member_id) do
    Repo.all(from m in Member,
            where: m.member_id== ^member_id
    )
  end

Please teach me.

export the value out of the if block like this:

result_of_if = if test do
  #some code
  result_from_true
else
  #some code
  result_from_false
end

(remember everything in elixir has a return value)

How can I recognize return value type from Repo.all when it return no data?

It’s been a very long time since I used ecto, but I believe Repo.all emits a list. If it finds nothing, then it emits an empty list.

You probably want:

case Repo.all do
  [] -> # found no items
  [ data ] -> # found one item
end

Are you sure you don’t want to be using Repo.one?

1 Like

I would like to write in controller. I don’t understand how to write in controller.
Because I’m from ruby on rails, There are not if check in Elixir?

There are: Kernel — Elixir v1.16.0

Answering the question stated. Repo.all/2 that is essentially wrapped with get_member/1 returns a list, which is empty if no results were returned. That said, the if statement would look like:

member =
  if member == [], do: App.get_member(member_id - 1), else: member

case statement as shown by @ityonemo is still a preferred way to go, though.

2 Likes

Why don’t you just use a SQL query?

def get_member(member_id, other_member_id) do
  Repo.all( 
    from(
      m in Member, 
      order_by: [desc_nulls_last: m.id], 
      where: m.id == fragment("ANY(?)", ^[member_id, other_member_id]), 
      limit: 1
    )
  )
end
4 Likes

def index(conn, _params) do
member_id = get_member_id(id)
member = App.get_member(member_id)
render(conn, “index.html”, [member : member ])
end

defp get_member_id(nil), do: your logic
defp get_member_id(10), do: your logic
defp get_member_id(id), do: id