mirror of
https://github.com/ash-project/ash.git
synced 2024-09-20 05:23:03 +12:00
fix: ensure that to-many relationships are loaded as lists
This commit is contained in:
parent
e50326cb56
commit
3e82d05edb
1 changed files with 45 additions and 19 deletions
|
@ -711,33 +711,59 @@ defmodule Ash.Actions.Read.Relationships do
|
|||
Enum.map(records, fn record ->
|
||||
value = Map.get(record, relationship.source_attribute)
|
||||
|
||||
Map.put(
|
||||
record,
|
||||
relationship.name,
|
||||
apply_runtime_query_operations(
|
||||
Map.get(related, value) || default,
|
||||
related_query
|
||||
if relationship.cardinality == :many do
|
||||
Map.put(
|
||||
record,
|
||||
relationship.name,
|
||||
apply_runtime_query_operations(
|
||||
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)
|
||||
else
|
||||
Enum.map(records, fn record ->
|
||||
value = Map.get(record, relationship.source_attribute)
|
||||
|
||||
related
|
||||
|> Enum.find_value(:error, fn result ->
|
||||
destination_value = Map.get(result, relationship.destination_attribute)
|
||||
if relationship.cardinality == :many do
|
||||
related
|
||||
|> Enum.filter(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)
|
||||
Ash.Type.equal?(attribute.type, value, destination_value)
|
||||
end)
|
||||
|> then(fn result ->
|
||||
result =
|
||||
apply_runtime_query_operations({:ok, result}, related_query)
|
||||
|
||||
put_result(record, result, relationship.name, default)
|
||||
end)
|
||||
put_result(record, result, relationship.name, default)
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue