如何使用Active-record-serializer生成自定义结构的列表JSON数据
解决方案
1. 优化Controller查询,避免N+1问题
修改ListsController的index方法,预加载关联数据以提升性能:
# GET /lists def index @lists = current_user.lists.includes(items: :category) render json: @lists end
2. 修改ListSerializer,构造预期的嵌套结构
更新ListSerializer,移除原有的has_many :items,添加自定义categories属性生成目标JSON结构:
class ListSerializer < ActiveModel::Serializer attributes :id, :name, :status, :categories def categories # 获取当前列表关联的所有唯一分类 unique_categories = object.items.map(&:category).uniq unique_categories.map do |category| # 筛选出当前列表中属于该分类的条目 filtered_items = object.items.select { |item| item.category_id == category.id } { id: category.id, name: category.name, Items: ActiveModelSerializers::SerializableResource.new(filtered_items, each_serializer: ItemSerializer) } end end end
3. (可选)调整ItemSerializer匹配预期字段
如果预期JSON中的Items仅需基础字段,可简化ItemSerializer:
class ItemSerializer < ActiveModel::Serializer attributes :id, :name end
说明
- 自定义序列化逻辑实现了条目按分类分组,每个分类仅保留当前列表关联的条目
- 预加载
items: :category有效避免了多轮数据库查询 - 若需要保留条目的
note、image等额外字段,直接在ItemSerializer的attributes中添加即可
内容的提问来源于stack exchange,提问作者Bobb-wiz
相关产品推荐
相关产品推荐

