joeljuca / swiss_schema

A Swiss Army knife for your Ecto schemas
https://hex.pm/packages/swiss_schema
Apache License 2.0
26 stars 4 forks source link

Add `:preload` option to retrieve and creation functions #21

Open zoedsoupe opened 5 months ago

zoedsoupe commented 5 months ago

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"}]}
joeljuca commented 2 months ago

I'm thinking about the functions that would make sense to receive such opt. I listed below the ones that seem to make sense:

WDYT?