Эффективно разрешает отношения own_to в загрузчике данных elixir? - PullRequest
1 голос
/ 06 августа 2020

Можно ли использовать загрузчик данных elixir для эффективного запроса отношения belongs_to? Кажется, что 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, поскольку мне нужно явно указать схема узла и поле node_id родительской схемы вместо того, чтобы позволить загрузчику данных вывести его из существующих схем экто:

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

1 Ответ

2 голосов
/ 07 августа 2020

Мне удалось это исправить, сделав node_id a primary_key родительской схемы следующим образом:

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

Я не уверен, что это предназначено для dataloader поскольку кажется, что проверка primary_key должна выполняться на дочернем объекте, а не на родительском объекте.

...