1

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

在这个例子中,我有产品和评论,产品可以有很多评论,评论属于一个产品。评论有评论:字符串和星星:int。我的一切正常,所以我可以退回所有带有所有评论的产品。我也知道如何退回带有所有评论的单个产品。

我现在追求的是所有产品,然后是所有评分大于 3 的评论。

所以我会假设类似

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

但我想

{
    products{
        reviews {
              stars
         }
     }
}

如果可能的话,也要工作并返回所有评论

我见过的大多数教程都是在 js 中...使用一些 -> resolver(obj,arg,ctx) 语法,看起来对 ruby​​ 不再有效。

还是通用抓取所有记录。

查询类型.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 子句。

这样做的最佳方法是什么?

4

1 回答 1

1

这样的事情怎么样。

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

未经测试。但你明白了。

于 2019-07-18T05:19:36.230 回答