Как сортировать по вложенному полю в ruby ​​​​graphql?

Как выполнить сортировку по вложенному полю (или виртуальному атрибуту) в 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
        }
    }
}
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
0
1 400
1

Ответы 1

Вы не можете заказать активную запись по 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 с запросом базы данных.

Я не могу использовать первое предложение, потому что порядок по вложенному_полю не является активным полем записи. Я не понимаю второе предложение. Как перечисление помогает мне сортировать виртуальный атрибут при получении списка ExampleTypes?

Terence Chow 18.02.2019 17:38

Извините, я пропустил проблему с сортировкой по вложенным полям в Ruby Activerecord.

galkin 18.02.2019 17:39

«Как перечисление помогает мне сортировать» — GraphQL — это язык, основанный на типах. Использование перечислений лучше, чем использование строки.

galkin 18.02.2019 17:41

Я меняю свой ответ. Если вы должны переместить свое вложенное_поле в представление БД, вы можете использовать БД для сортировки с активной записью.

galkin 18.02.2019 17:54

Другие вопросы по теме