Как настроить схему Absinthe с именами полей, отличными от базовых имен полей Ecto?

Например, я хотел бы вызвать временную метку inserted_on created_at во внешнем интерфейсе в следующей схеме Absinthe:

defmodule MyAppWeb.Schema.AccountTypes do
  use Absinthe.Schema.Notation

  object :user do
    field :id, :id
    field :email, :string
    field :inserted_on, :datetime
  end
end

но я не уверен, как настроить сопоставление Ecto ‹-> Absinthe. Должен ли я просто добавить виртуальное поле в мою схему Ecto?


person Michael Johnston    schedule 21.01.2018    source источник


Ответы (1)


Одним из вариантов может быть использование параметра :source в схемах Ecto для полей базы данных, чтобы вы могли использовать свое собственное внутреннее имя:

defmodule MyAppWeb.Schema.AccountTypes do
  use Absinthe.Schema.Notation

  object :user do
    field :id, :id
    field :email, :string
    field :created_at, :datetime, source: :inserted_on
  end
end

Но лучшим вариантом, вероятно, было бы установить правильное имя поля в макросе запроса:

defmodule My.Schema do
  use Absinthe.Schema
  query do
    field :created_at, :string do
      resolve &MyResolver.inserted_on/3
  end
end

.. или используйте свой собственный тип данных вместо строки..

person raarts    schedule 24.01.2018
comment
Я попробовал первое решение (конечно, применительно к моей структуре данных), но получил эту ошибку: ` ** (KeyError) key :source not found Expanding struct::Absinthe.Type.Field.__struct__/1` Возможно ли, что эта опция source была удалена из Absinthe? - person user2414208; 19.03.2019
comment
Это относительно новая функция, поэтому, возможно, проверьте свою экто-версию. Это описано здесь: hexdocs.pm/ecto/Ecto.Schema.html#field/ 3 - person raarts; 20.03.2019