swiss_schema
swiss_schema copied to clipboard
Add `:preload` option to retrieve and creation functions
Introduction
A cool feature of ecto queries and schemas is to perform cross table join that have associations between them, that way you can retrieve assoc data with simple functions pipelines, as:
def get_user(id) do
if user = Repo.get(User, id) do
Repo.preload(user, [:permissions, games: [:owner]])
end
end
Another option is to define a query to retrieve in a single expression the whole structure:
def get_user(id) do
q =
from u in User,
where: u.id == ^id,
preload: [:permissions, games: [:owner]]]
Repo.one(q)
end
Proposal
I’m proposing a new option to swiss_schema functions to apply such preloading assocs on retrieve and creation functions:
defmodule User do
use Ecto.Schema
use SwissSchema, repo: MyApp.Repo
# schema...
end
User.get(id, preload: [:permissions, games: [:owner]])
# %User{id: id, permissions: [], games: [%Game{owner: “foo"}]}
I'm thinking about the functions that would make sense to receive such opt. I listed below the ones that seem to make sense:
-
get/2,get!/2,get_by/2,get_by!/2, andall/1(Ecto.Repo Query API) -
insert/2,insert!/2,insert_or_update/2,insert_or_update!/2(Ecto.Repo Schema API) -
create/2andcreate!/2(SwissSchema API)
WDYT?