A repository of tips and tricks (in both English and French) curated by Mirego’s engineering team.
  • ecto
  • elixir

Utiliser les associations Ecto pour simplifier nos requêtes

Les associations Ecto sont très pratiques pour déclarer les relations qui unissent nos différents schémas.

defmodule MyApp.User do
  use Ecto.Schema

  schema "users" do
    field(:name, :string)
    field(:email, :string)

    belongs_to(:team, MyApp.Team)

    timestamps()
  end
end

defmodule MyApp.Team do
  use Ecto.Schema

  schema "teams" do
    field(:name, :string)

    has_many(:users, MyApp.User)

    timestamps()
  end
end

Ces associations servent notamment au mapping facile des données dans les structures des schémas, au preloading de données et à facilement les manipuler lorsqu’on travaille avec les Ecto.Changeset.

Un usage un peu moins fréquent pour ces associations réside dans les requêtes d’Ecto, via la fonction Ecto.assoc/2.

Prenons par exemple ces quelques lignes de code :

# The `id` variable could be a a query string parameter
team = Repo.get(MyApp.Team, id)

# Fetch and sort all users from the team
users = Repo.all(from(user in Users, where: user.team_id = ^team.id, order_by: asc: :name))

On peut simplement faire :

# The `id` variable could be a a query string parameter
team = Repo.get(MyApp.Team, id)

# Fetch and sort all users from the team
users = team
|> Ecto.assoc(:users)
|> order_by(asc: :name)
|> Repo.all()

Ça nous évite donc de bâtir des clauses where manuellement avec de l’interpolation! 🎉