Как выполнить сортировку по вложенному полю (или виртуальному атрибуту) в graphql-руби?
ExampleType = GraphQL::ObjectType.define do
name 'Example'
description '...'
field :nested_field, NestedType, 'some nested field' do
// some result that is virtually calculated and returns
OpenStruct.new(a: 123//some random number, b: 'some string')
end
end
QueryType = GraphQL::ObjectType.define do
name 'query'
field: example, ExampleType do
resolve -> (_obj, args,_ctx) {
Example.find(args['id']) //Example is an active record
}
end
field: examples, types[ExampleType] do
resolve -> (_obj, args,_ctx) {
// NOTE: How to order by nested field here?
Example.where(args['id'])
}
end
end
И если я пытаюсь получить список примеров, упорядоченных по nested_field.a:
query getExamples {
examples(ids: ["1","2"], order: 'nested_field.a desc') {
nested_field {
a
}
}
}

Вы не можете заказать активную запись по virtual attribute, потому что активная запись не может сопоставить эту virtual attribute с запросом SQL/NoSQL. Вы можете обойти ограничение на создание представления на уровне БД. В GraphQL сортировка/разбиение на страницы должны быть реализованы на уровне БД. Без этой реализации сортировки/разбиения на страницы запрашиваются все данные из БД в память приложения.
Кроме того, я хочу порекомендовать вам переключиться с аргумента order со строковым типом на аргумент sort с типом [SearchSort!] на основе перечислений. Схема GraphQL будет выглядеть так:
input SearchSort {
sorting: Sorting!
order: Order = DESC
}
enum Sorting {
FieldName1
FieldName2
}
enum Order {
DESC
ASC
}
Это поможет вам реализовать сопоставление подзапроса GraphQL с запросом базы данных.
Извините, я пропустил проблему с сортировкой по вложенным полям в Ruby Activerecord.
«Как перечисление помогает мне сортировать» — GraphQL — это язык, основанный на типах. Использование перечислений лучше, чем использование строки.
Я меняю свой ответ. Если вы должны переместить свое вложенное_поле в представление БД, вы можете использовать БД для сортировки с активной записью.
Я не могу использовать первое предложение, потому что порядок по вложенному_полю не является активным полем записи. Я не понимаю второе предложение. Как перечисление помогает мне сортировать виртуальный атрибут при получении списка
ExampleTypes?