如何在as_json的has_many关联输出中限制返回数量?
解决多对多关联在as_json中限制返回数量的方案
针对你遇到的Person和Client多对多关联,想在概览查询时只返回前3个Client的需求,这里有几个不用大改现有代码的方案:
直接在as_json的include中用lambda限制查询
这是最贴合你现有调用模式的方法,不用修改模型,只需要调整as_json的参数。把关联的查询逻辑用lambda传入,就能在查询关联数据时直接加limit,同时指定返回字段:Person.first.as_json( include: { clients: -> { select(:id, :name).limit(3) } } )之前你尝试直接在include哈希里加
limit: 3无效,是因为那是as_json的序列化选项,不是关联数据的查询条件;而lambda会直接作用于关联的ActiveRecord集合,生成带limit的SQL,效率也更高。复用逻辑的小封装
如果多个地方都需要这个限制,可以在控制器里写个小方法封装选项,避免重复代码:def overview_person_json_options { include: { clients: -> { select(:id, :name).limit(3) } } } end # 调用时直接传这个方法返回的哈希 Person.first.as_json(overview_person_json_options)内存截断(适合已预加载的场景)
如果你已经预加载了全部Client数据(比如用includes(:clients)),可以直接在内存里截断前3个再序列化:person = Person.includes(:clients).find(1) person.clients = person.clients.limit(3) person.as_json(include: { clients: { only: ['id', 'name'] } })这个方法不用改查询,但如果关联数据特别多,预加载全部再截断会浪费内存,优先用第一个方案。
内容的提问来源于stack exchange,提问作者mihovale
相关产品推荐
相关产品推荐

