Rocío Alvarado
Rocío Alvarado

Reputation: 89

Dynamic code in Elixir

I'm trying to make a query to this table in my Repo:

 user_id | create_author | delete_author | update_author | read_author
----------------------------------------------------------------------
   1     |   true        |    false      |    false      |   true

In my code, I get the column's name as a string (e.g. variable = "create_author"). How can I insert variable into my query?

When I have hardcoded create_author it does work:

def auth() do
    App.Permission
    |> where(user_id: ^Map.get(current_user, :id))
    |> where(read_author: true)
    |> Repo.one()
    |> case do
      nil -> false
      _user -> true
    end
end

I want to be able to enter a variable = "read_author" or variable = :read_author

Upvotes: 1

Views: 63

Answers (1)

Dogbert
Dogbert

Reputation: 222040

You can use a field expression for this:

def auth() do
  variable = :read_author
  App.Permission
  |> where(user_id: ^Map.get(current_user, :id))
  |> where([p], field(p, ^variable) == true) # <- this
  |> Repo.one()
  |> case do
    nil -> false
    _user -> true
  end
end

If you have a string, you can convert it to an atom using String.to_existing_atom/1 or String.to_atom/1.

Upvotes: 2

Related Questions