使用解析器在GraphQL和Ruby中获取更复杂的查询

时间:2019-04-03 07:48:52

标签: ruby-on-rails graphql graphql-ruby

尝试在Ruby on Rails API中学习GraphQL我正在使用graphql gem。

在此示例中,我有产品和评论,该产品可以有许多评论和评论属于一个产品。评论有评论:字符串和星星:int。 我一切正常,因此我可以退还所有带有所有评论的产品。我也知道如何退还所有评论的单个产品。

我现在想要的是所有产品,然后是所有星级评分都高于3的评论。

所以我会假设类似

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

但是我想要

{
    products{
        reviews {
              stars
         }
     }
}

也可以正常工作并返回所有评论

我见过的大多数教程都在js中...使用一些-> 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

我希望能够通过评论并获得所有评论 而且还可以在其中使用where子句。

做到这一点的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

这样的事情怎么样。

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

未经测试。但是你明白了。