This is a pattern for preloading in Elixir that I have adopted for a few projects. I’m sharing it here for reference. The idea is to have one place to define your preloads instead of in every query.
@preloads [:listens] defp with_preloads(query), do: preload(query, ^@preloads) def preload_artist(artist), do: Repo.preload(artist, @preloads)
with_preloads can be used to enhance an query with preloads:
def list_artists do Artist |> with_preloads() |> Repo.all() end
Whereas preload_artist() is used to preload a single object, for example, after getting a single artist:
def get_artist!(id), do: Repo.get!(Artist, id) |> preload_artist()