swiss_schema icon indicating copy to clipboard operation
swiss_schema copied to clipboard

Add `:preload` option to retrieve and creation functions

Open zoedsoupe opened this issue 2 years ago • 1 comments

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"}]}

zoedsoupe avatar Jan 28 '24 19:01 zoedsoupe

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, and all/1 (Ecto.Repo Query API)
  • insert/2, insert!/2, insert_or_update/2, insert_or_update!/2 (Ecto.Repo Schema API)
  • create/2 and create!/2 (SwissSchema API)

WDYT?

joeljuca avatar May 06 '24 04:05 joeljuca