Does anyone know if I can use dataloader to load a relation of a relation?
I have code that’s like this:
def load_relations(
struct_or_list,
relations,
%{context: %{loader: loader}},
post_process \\ & &1
) do
load_all(struct_or_list, relations, loader)
|> on_load(fn loader ->
Enum.reduce(relations, struct_or_list, fn relation, parent ->
%{parent | relation => Dataloader.get(loader, :nest_db, relation, struct_or_list)}
end)
|> post_process.()
end)
end
defp load_all(struct_or_list, relations, loader) do
Enum.reduce(relations, loader, fn
relation, loader ->
Dataloader.load(loader, :nest_db, relation, struct_or_list)
end)
end
which allows me to do this:
field(:thing, :thing) do
resolve(
load_relations( [:first_relation, :second_relation], fn thing -> ...whatever end)
)
end
that works but I want to turn it into this:
field(:thing, :thing) do
resolve(
load_relations( [:first_relation, second_relation: [:nested_third_relation]], fn thing -> ...whatever end)
)
end
I’ve tried doing this:
defp load_all(struct_or_list, relations, loader) do
Enum.reduce(relations, loader, fn
{relation, nested_relations}, loader ->
load_all(
# At this point we want the struct or list to be a different struct...
struct_or_list,
nested_relations,
Dataloader.load(loader, :nest_db, relation, struct_or_list)
)
relation, loader ->
Dataloader.load(loader, :nest_db, relation, struct_or_list)
end)
end
But that fails because of the comment above.
Am I barking up the wrong proverb?