fix: ensure that to-many relationships are loaded as lists

This commit is contained in:
Zach Daniel 2024-02-16 20:17:59 -05:00
parent e50326cb56
commit 3e82d05edb

View file

@ -711,33 +711,59 @@ defmodule Ash.Actions.Read.Relationships do
Enum.map(records, fn record -> Enum.map(records, fn record ->
value = Map.get(record, relationship.source_attribute) value = Map.get(record, relationship.source_attribute)
Map.put( if relationship.cardinality == :many do
record, Map.put(
relationship.name, record,
apply_runtime_query_operations( relationship.name,
Map.get(related, value) || default, apply_runtime_query_operations(
related_query Map.get(related, value) || default,
related_query
)
) )
) else
Map.put(
record,
relationship.name,
apply_runtime_query_operations(
Enum.at(List.wrap(Map.get(related, value) || default), 0),
related_query
)
)
end
end) end)
else else
Enum.map(records, fn record -> Enum.map(records, fn record ->
value = Map.get(record, relationship.source_attribute) value = Map.get(record, relationship.source_attribute)
related if relationship.cardinality == :many do
|> Enum.find_value(:error, fn result -> related
destination_value = Map.get(result, relationship.destination_attribute) |> Enum.filter(fn result ->
destination_value = Map.get(result, relationship.destination_attribute)
if Ash.Type.equal?(attribute.type, value, destination_value) do Ash.Type.equal?(attribute.type, value, destination_value)
{:ok, result} end)
end |> then(fn result ->
end) result =
|> then(fn result -> apply_runtime_query_operations({:ok, result}, related_query)
result =
apply_runtime_query_operations(result, related_query)
put_result(record, result, relationship.name, default) put_result(record, result, relationship.name, default)
end) end)
else
related
|> Enum.find_value(:error, fn result ->
destination_value = Map.get(result, relationship.destination_attribute)
if Ash.Type.equal?(attribute.type, value, destination_value) do
{:ok, result}
end
end)
|> then(fn result ->
result =
apply_runtime_query_operations(result, related_query)
put_result(record, result, relationship.name, default)
end)
end
end) end)
end end
end end