Blog

Ecto.Repo.get_by(queryable, clauses, opts), formato de clauses

Ecto.Repo.get_by(queryable, clauses, opts), formato de clauses

En la función de Ecto Repo.get_by los clauses pueden ser tanto una lista de keywords como un mapa. Lo pongo por aquí porque esto me ha confundido a veces:
get_by!(queryable, clauses, opts) View Source(optional)
get_by!(
  queryable :: Ecto.Queryable.t(),
  clauses :: Keyword.t() | map(),
  opts :: Keyword.t()
) :: Ecto.Schema.t()
Por ejemplo:
[j@localhost poi_umbrella]$ iex -S mix
[...]
iex(9)> alias Ecto.Changeset 
Ecto.Changeset
iex(10)> alias Poi.Repo
Poi.Repo

iex(26)> user = Poi.Accounts.get_user_by([username: "josevalim"])
[debug] QUERY OK source="users" db=1.9ms
SELECT u0."id", u0."name", u0."username", u0."inserted_at", u0."updated_at" FROM "users" AS u0 WHERE (u0."username" = $1) ["josevalim"]
%Poi.Accounts.User{
  [...]
}
iex(27)> user = Poi.Accounts.get_user_by(%{username: "josevalim"})
[debug] QUERY OK source="users" db=2.6ms
SELECT u0."id", u0."name", u0."username", u0."inserted_at", u0."updated_at" FROM "users" AS u0 WHERE (u0."username" = $1) ["josevalim"]
%Poi.Accounts.User{
  [...]
}
iex(28)> user = Poi.Accounts.get_user_by(username: "josevalim")   
[debug] QUERY OK source="users" db=2.4ms
SELECT u0."id", u0."name", u0."username", u0."inserted_at", u0."updated_at" FROM "users" AS u0 WHERE (u0."username" = $1) ["josevalim"]
%Poi.Accounts.User{
  [...]
}

Como vemos en la tercera, [username: "josevalim"] es equivalente a username: "josevalim".