Graphql 在elixir数据加载器中有效地解决属于您的关系?
是否可以使用elixir dataloader高效地查询Graphql 在elixir数据加载器中有效地解决属于您的关系?,graphql,elixir,dataloader,absinthe,Graphql,Elixir,Dataloader,Absinthe,是否可以使用elixir dataloader高效地查询所属关系?似乎load正在查询它需要的所有项目,但是get正在返回加载项目的第一个值,而不管它实际需要哪个项目。这是我现在使用的代码: field :node, :node_object, resolve: fn parent, _, %{context: %{loader: loader}} -> # parent.node_id = 1, but concurrently also another parent.node_id
所属关系?似乎load
正在查询它需要的所有项目,但是get
正在返回加载项目的第一个值,而不管它实际需要哪个项目。这是我现在使用的代码:
field :node, :node_object, resolve: fn parent, _, %{context: %{loader: loader}} ->
# parent.node_id = 1, but concurrently also another parent.node_id = 5
loader
|> Dataloader.load(NodeContext, :node, parent) # loads node_id 5 and 1
|> on_load(fn loader ->
loader
|> Dataloader.get(NodeContext, :node, parent) # always returns the node with id = 5
|> (&{:ok, &1}).()
end)
end
我目前的解决方法是使用以下代码,但这会使代码更加难看,并且对Ecto模式不友好,因为我需要在此处显式指定父模式的节点模式和节点id字段,而不是让dataloader从现有的Ecto模式推断它:
field :node, :node_object, resolve: fn parent, _, %{context: %{loader: loader}} ->
loader
|> Dataloader.load(NodeContext, {:one, NodeSchema}, id: parent.node_id)
|> on_load(fn loader ->
loader
|> Dataloader.get(NodeContext, {:one, NodeSchema}, id: parent.node_id)
|> (&{:ok, &1}).()
end)
end
我可以通过将父模式的node\u id
设置为primary\u键
来解决这个问题,如下所示:
defmodule MyApp.ParentSchema do
use Ecto.Schema
alias MyApp.NodeSchema
@primary_key false
embedded_schema do
belongs_to :node, NodeSchema, primary_key: true
end
end
我不确定这是否是数据加载器的预期行为,因为它似乎应该在子对象而不是父对象上进行主键检查。请不要忘记在允许时将此答案标记为正确。