A repository of bitesize articles, tips & tricks
(in both English and French) curated by Mirego’s team.
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! 🎉