Один из способов сделать это - создать with_<association>
функции в вашем контекстном модуле, например:
def get_account!(id), do: Repo.get!(Account, id)
def with_company(%Account{} = account), do: Repo.preload(account, :company)
def with_users(%Account{} = account), do: Repo.preload(account, :users)
, чтобы вы могли использовать их в своем контроллере следующим образом:
def show(conn, %{"id" => id}) do
account =
Context.get_account!(id)
|> Context.with_company
|> Context.with_users
render(conn, "show.html", account: account)
end
и у вас есть полностью загруженная учетная запись, доступная в представлении.
Хорошая особенность этого подхода заключается в том, что вы можете легко расширить его с помощью более специфических предварительных загрузок, например account |> with_most_active_users(10)
.