Graphql 在elixir数据加载器中有效地解决属于您的关系?

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

是否可以使用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 = 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

我不确定这是否是
数据加载器的预期行为,因为它似乎应该在子对象而不是父对象上进行
主键检查。

请不要忘记在允许时将此答案标记为正确。