【问题标题】:Rails - active model serialize an array of hashes within a serializerRails - 活动模型在序列化程序中序列化哈希数组
【发布时间】:2023-03-17 14:08:01
【问题描述】:

我正在尝试创建一个嵌套的序列化哈希数组。到目前为止,我有以下内容。它不返回嵌套的序列化程序,而只返回哈希数组。

module Api
  module V1
    class ReportShowSerializer < ActiveModel::Serializer
      attributes :name, :schedule, :uuid, :reports

       has_many :reports, each_serializer: ReportBuildSerializer

      def reports
        [
          {date: '2018-10-04', test: 'a'},
          {date: '2018-10-03', test: 'b'}
        ]
      end
    end
  end
end

和其他序列化程序

module Api
  module V1
    class ReportBuildSerializer < ActiveModel::Serializer
      attributes :test, :date, :var


      def var
        "var"
      end
    end
  end
end

但它返回以下内容

{
    "data": {
        "id": "2",
        "type": "reports",
        "attributes": {
            "name": "Another test report",
            "schedule": "weekly",
            "uuid": "f10736ae-bf5c-4e43-8cd4-35eb0dc12efd",
            "reports": [
                {
                    "date": "2018-10-04",
                    "test": "ff"
                },
                {
                    "date": "2018-10-03",
                    "test": "ff"
                }
            ]
        }
    }
}

所以我认为它没有使用ReportBuildSerializer

【问题讨论】:

  • 我猜你应该重命名/删除 reports 方法,它与关联的序列化程序冲突

标签: ruby-on-rails ruby active-model-serializers rails-api


【解决方案1】:

当你渲染你的对象时(reports)可能在controller。你能确保你这样做:

render json: @reports, include: 'reports'

如果它不起作用,那么您可以使用另一种方法:

module Api
  module V1
    class ReportShowSerializer < ActiveModel::Serializer
      attributes :name, :schedule, :uuid, :reports

       has_many :reports, each_serializer: ReportBuildSerializer

      def reports
        [
          ::Api::V1:: ReportBuildSerializer.new({date: '2018-10-04', test: 'a'}).attributes,
          ::Api::V1:: ReportBuildSerializer.new({date: '2018-10-03', test: 'b'}).attributes
        ]
      end
    end
  end
end

【讨论】:

  • 我会把它重命名为build_report 这样我会像这样更新代码吗? ` 模块 Api 模块 V1 类 ReportShowSerializer
  • 在尝试使用 include 之前不要重命名它。我认为您的代码应该按原样工作。只是没有使用include/has_many 功能。
  • 您能分享一下您是如何使用这个序列化程序的吗?你如何呈现你的报告?
  • 我应该把render json: @reports, include: 'reports'改成render json: @reports, include: 'build_report'
  • 这样render json: report, status: 200, serializer: ReportShowSerializer, include: 'reports'
猜你喜欢
  • 2016-04-26
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
相关资源
最近更新 更多