如何让ActiveModelSerializer返回标签值数组而非对象?
解决方法
方式一:在Article序列化器中自定义tagList字段
直接在ArticleSerializer里新增自定义字段,通过关联的tags提取名称数组:
# app/serializers/article_serializer.rb class ArticleSerializer < ActiveModel::Serializer attributes :id, :title, :content, :tag_list def tag_list object.tags.pluck(:name) end end
Rails默认会将下划线命名的tag_list转为驼峰格式tagList,刚好匹配接口所需的字段名。
方式二:替换原有关联序列化逻辑
如果之前的ArticleSerializer是通过has_many关联TagSerializer来返回标签对象数组,直接替换为自定义字段即可:
# 原写法(返回对象数组) class ArticleSerializer < ActiveModel::Serializer has_many :tags, key: :tagList end # 修改后写法(返回字符串数组) class ArticleSerializer < ActiveModel::Serializer attributes :id, :title, :content, :tag_list def tag_list object.tags.pluck(:name) end end
方式三:显式指定字段名(可选)
如果需要更明确控制返回的字段名,可以用attribute方法指定key:
class ArticleSerializer < ActiveModel::Serializer attributes :id, :title, :content attribute :tag_list, key: :tagList def tag_list object.tags.pluck(:name) end end
注意事项
- 确保
Article模型已正确定义与Tag的关联,比如has_many :tags,若通过中间表关联则写has_many :tags, through: :article_tags - 使用
pluck(:name)会直接生成SQL查询获取标签名称,比加载完整Tag对象后再提取属性更高效
内容的提问来源于stack exchange,提问作者Safouane Jelassi
相关产品推荐
相关产品推荐

