在Rails中使用jsonapi-rb条件渲染关联关系失效,如何解决?
解决jsonapi-rb序列化器条件移除关联字段的问题
你遇到的问题是因为jsonapi-rb的if选项仅控制是否包含关联的具体数据,而非完全移除relationships中的对应字段,所以会留下带meta: {included: false}的条目。要完全移除该字段,需要使用序列化器的include_<relationship_name>?自定义方法:
解决方案代码
class ProductSerializer include JSONAPI::Serializer attributes :name, :price, :product_type belongs_to :category has_many :reviews # 自定义是否渲染category关联字段的判断逻辑 def include_category? object.trending? end end
效果验证
当record.trending?为false时,响应的relationships中将不再包含category字段,和你预期的输出一致:
{ "data": { "id": "3", "type": "products", "attributes": { "title": "Test products", "product_type": "something", "price": "12345" }, "relationships": { "reviews": { "data": [] } } }, "included": [], "jsonapi": { "version": "1.0" } }
原理说明
jsonapi-rb序列化器会自动检查include_<relationship_name>?方法的返回值:
- 返回
true时,渲染完整的关联字段(包含数据或meta) - 返回
false时,完全跳过该关联字段的渲染
这种方式比if: Proc更彻底,直接控制字段是否出现在响应中。
内容的提问来源于stack exchange,提问作者George Maharjan
相关产品推荐
相关产品推荐

