尝试在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子句。
做到这一点的最佳方法是什么?
答案 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
未经测试。但是你明白了。