Объекты, возвращаемые из запроса GraphQL, не обязательно должны быть объектами ActiveRecord, им просто нужны методы, которые сопоставляются с вашими именами полей, или ваши поля должны иметь методы, которые могут извлекать необходимые данные из объекта.
Вот пример, в котором используются несколько различных способов приведения к типу:
module Types
class MentionType < BaseObject
field :id, Integer, null: false
field :name, String, null: false
field :name_upper, String, null: false
def name_upper
if object.is_a?(Hash)
object[:name].upcase
else
object.name.upcase
end
end
end
end
module Types
class QueryType < Types::BaseObject
field :mentions, [MentionType], null: true
def mentions
[
Struct.new(:id, :name).new(1, 'Struct'),
OpenStruct.new(id: 2, name: 'OpenStruct'),
{ id: 3, name: 'Hash' },
CustomObject.new(id: 4, name: 'CustomObject'),
]
end
class CustomObject
def initialize(attrs)
@attrs = attrs
end
def id
@attrs[:id]
end
def name
@attrs[:name]
end
end
end
end
Запрос:
query {
mentions {
id
name
nameUpper
}
}
Результат:
{
"data": {
"mentions": [
{
"id": 1,
"name": "Struct",
"nameUpper": "STRUCT"
},
{
"id": 2,
"name": "OpenStruct",
"nameUpper": "OPENSTRUCT"
},
{
"id": 3,
"name": "Hash",
"nameUpper": "HASH"
},
{
"id": 4,
"name": "CustomObject",
"nameUpper": "CUSTOMOBJECT"
}
]
}
}