Я добавил ассоциацию «многие ко многим» для пары моих моделей, и, похоже, она работает нормально в отдельности, то есть без объявлений схемы GraphQL. Вот код для одной из моих моделей:
use Ecto.Schema
import Ecto.Changeset
alias Trader.Collect.Card
schema "users" do
field(:email, :string)
field(:first_name, :string)
field(:last_name, :string)
field(:password, :string)
field(:username, :string)
many_to_many(:cards, Card, join_through: "user_cards")
timestamps()
end
@doc false
def changeset(user, attrs) do
user
|> cast(attrs, [:first_name, :last_name, :email, :username, :password])
|> validate_required([:first_name, :last_name, :email, :username, :password])
end
end
А вот и объявление типа GraphQL:
defmodule TraderWeb.Schema.Types.User do
use Absinthe.Schema.Notation
@desc "User model representation"
object :user do
field(:id, non_null(:id))
field(:first_name, non_null(:string))
field(:last_name, non_null(:string))
field(:username, non_null(:string))
field(:email, non_null(:string))
field(:password, non_null(:string))
# field(:cards, list_of(:card), resolve: assoc(:cards))
end
end
Это определение схемы верхнего уровня для части Absinthe / GraphQL:
defmodule TraderWeb.Schema.Schema do
use Absinthe.Schema
import_types(Absinthe.Type.Custom)
# Import Types individually here
import_types(TraderWeb.Schema.Types.{
User,
Card,
CardSet
})
# import queries here
import_types(TraderWeb.Schema.Queries.{
User,
Card,
CardSet
})
query do
import_fields(:user_queries)
import_fields(:card_queries)
import_fields(:card_set_queries)
end
end
Обратите внимание, что поле карточек закомментировано в поле Тип. В этом случае все работает нормально, однако, если я раскомментирую это поле с карточками, я получаю следующую ошибку:
== Compilation error in file lib/trader_web/schema/types/user.ex ==
** (CompileError) lib/trader_web/schema/types/user.ex:12: undefined function assoc/1
(elixir) src/elixir_locals.erl:108: :elixir_locals."-ensure_no_undefined_local/3-lc$^0/1-0-"/2
(elixir) src/elixir_locals.erl:108: anonymous fn/3 in :elixir_locals.ensure_no_undefined_local/3
(stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
(elixir) lib/kernel/parallel_compiler.ex:229: anonymous fn/4 in Kernel.ParallelCompiler.spawn_workers/7
Я довольно агрессивно гуглил эту проблему и не могу ничего найти для этого. Непонятно, где даже эта функция assoc
живет - это экто? или абсент-экто? Я также нашел пример кода где-то, используя dataloader
, но я не смог заставить его работать вообще.
Я ценю любые мысли и идеи, которые у вас есть! спасибо