Как отсортировать по вложенному полю в graphql ruby? - PullRequest
0 голосов
/ 18 февраля 2019

Как мне отсортировать вложенное поле (или виртуальный атрибут) в graphql-ruby ?

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
        }
    }
}

1 Ответ

0 голосов
/ 18 февраля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...