Использование распознавателей для получения более сложных запросов в GraphQL и Ruby - PullRequest
0 голосов
/ 03 апреля 2019

Пытаюсь изучить GraphQL в Ruby on Rails API. Я использую гем graphql.

В этом примере у меня есть продукты и рецензии, у продукта может быть много отзывов, и рецензия относится к одному продукту.Отзывы есть комментарий: строка и звезды: int.У меня все работает, поэтому я могу вернуть все товары со всеми отзывами.Я также знаю, как вернуть один продукт со всеми отзывами.

Что мне теперь нужно, так это все продукты, а затем все отзывы с рейтингом выше 3.

, поэтому я бы хотелof предположить что-то вроде

{ 
     products{
           reviews(where: "stars< 3") {
                  stars
           }
     }
}

Но я бы хотел, чтобы

{
    products{
        reviews {
              stars
         }
     }
}

также работал и возвращал все отзывы, если это возможно

Большинство учебников, которые я видел, написаны на js... использовать синтаксис some -> resolver (obj, arg, ctx), который больше не подходит для ruby.

Или универсальный захват всех записей.

query_type.rb

field :product, ProductType, null: false, description: "find product by id"do
      argument :id, ID, required: true
    end

field :products, [ProductType], null: false

def products
    Product.all
end

def product(id:)
    Product.find(id)
end

product_type.rb

module Types
  class ProductType < Types::BaseObject
    description " A product"

    field :id, ID, null: false
    field :title, String, null: false
    field :category, Types::CategoryType, null: false
    field :reviews, [Types::ReviewType], null: false
  end
end

review_type.rb

module Types
  class ReviewType < Types::BaseObject
    field :id, ID, null: false
    field :content, String, null: false
    field :stars, Integer, null: false
    field :product, Types::ProductType, null: false
  end
end

Я хотел бы иметь возможность передавать отзывы и получать их все, но также иуметь использовать там, где предложения.

Какой лучший способ сделать это?

1 Ответ

0 голосов
/ 18 июля 2019

Как насчет чего-то подобного.

запрос FE выглядит как

{ 
  products{
        reviews(rating_lower_limit: 1, rating_higher_limit: 3) {
               stars
        }
  }
}

product_type.rb

field :reviews, [Types::ReviewType], null: false do
  argument :rating_lower_limit, Integer, required: false
  argument :rating_higher_limit, Integer, required: false
end

def reviews(rating_lower_limit:, rating_higher_limit:)
  _reviews = object.reviews
  if (rating_lower_limit && rating_higher_limit)
    _reviews.where(stars: rating_lower_limit..rating_higher_limit)
  else
    _reviews
  end
end

непроверенная. Но вы поняли.

...