如何在Rails中正确编写ShopifyAPI::GraphQL方法?
解决Shopify GraphQL Client的DynamicQueryError问题
我之前也踩过这个坑,其实这个错误的核心原因很明确:Shopify的GraphQL客户端有个硬性要求——查询语句的解析结果必须绑定到静态类常量上,不能在方法内部动态生成局部变量来存储。
你在控制台能正常运行,是因为控制台是交互式环境,变量会一直保留在全局上下文里,相当于“静态存在”;但在模型方法里,每次调用方法都会重新执行client.parse生成新的查询对象,客户端会判定这是动态创建的查询,直接抛出错误。
正确写法:把查询定义为类级别常量
把查询语句提前在模型类的顶部解析完成,赋值给静态常量,方法里直接调用这个常量执行查询即可:
class YourModel < ApplicationRecord # 在类加载阶段就完成查询解析,绑定到静态常量 SHOP_NAME_QUERY = ShopifyAPI::GraphQL.new.parse <<-'GRAPHQL' { shop { name } } GRAPHQL def trial client = ShopifyAPI::GraphQL.new # 直接使用预定义的常量执行查询 client.query(SHOP_NAME_QUERY) end end
需要动态参数的查询怎么处理?
如果你的查询需要传入动态变量(比如产品ID),依然可以把查询主体定义为常量,然后在query方法里通过variables参数传递动态值,完全不冲突:
class YourModel < ApplicationRecord PRODUCT_DETAIL_QUERY = ShopifyAPI::GraphQL.new.parse <<-'GRAPHQL' query($productId: ID!) { product(id: $productId) { title description } } GRAPHQL def get_product_details(product_id) client = ShopifyAPI::GraphQL.new client.query(PRODUCT_DETAIL_QUERY, variables: { productId: product_id }) end end
这种写法不仅解决了错误,还能让查询语句只被解析一次(类加载时),提升后续方法调用的性能。
内容的提问来源于stack exchange,提问作者aldrien.h
相关产品推荐
相关产品推荐

