You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:00:55