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! 🎉