序列化嵌套属性 Active Model Serializer

Serializing Nested Attributes Active Model Serializer

我有以下代码,但似乎无法让我的 JSON 按照我的序列化程序输出。

我收到以下日志[active_model_serializers] Rendered SimpleJobSerializer with Hash

我的控制器如下:

# Jobs Controller

def home
    return_limit = 2

    @dev_jobs = Job.where(category: 'developer').limit(return_limit)
    @marketing_jobs = Job.where(category: 'marketing').limit(return_limit)
    @sales_jobs = Job.where(category: 'sales').limit(return_limit)


    @jobs = {
      developer: @dev_jobs,
      marketing: @marketing_jobs,
      sales: @sales_jobs
    }

    render json: @jobs, each_serializer: SimpleJobSerializer
  end

还有我的序列化程序:

class SimpleJobSerializer < ActiveModel::Serializer
  attributes :title, :company, :job_type, :date

  def date
    d = object.created_at
    d.strftime("%d %b")
  end
end

我正在收到完整的 API 回复,但预计只会收到 titlecompanyjob_typedate

值得一提的是,工作模型是完全扁平化的,目前没有任何关联需要考虑。似乎只是将作业嵌套到停止序列化的@jobs 对象中。

如有任何帮助,我们将不胜感激。

each_serializer 希望你传递一个数组,但在这里你传递的是一个散列:

@jobs = {
  developer: @dev_jobs,
  marketing: @marketing_jobs,
  sales: @sales_jobs
}

既然您想要这种结构,我会根据您的喜好推荐两种方法。一种是更改应控制格式的序列化程序:

class JobsSerializer < ActiveModel::Serializer
  attributes :developer, :marketing, :sales

  def developer
    json_array(object.where(category: "developer"))
  end

  def marketing
    json_array(object.where(category: "marketing"))
  end

  def sales
    json_array(object.where(category: "sales"))
  end

  def json_array(jobs)
    ActiveModel::ArraySerializer.new(jobs, each_serializer: SimpleJobSerializer)
  end
end

您仍然可以保留当前的序列化程序:

class SimpleJobSerializer < ActiveModel::Serializer
  attributes :title, :company, :job_type, :date

  def date
    d = object.created_at
    d.strftime("%d %b")
  end
end

或者选项 2 是在控制器中执行此操作:

@jobs = {
  developer: ActiveModel::ArraySerializer.new(@dev_Jobs, each_serializer: SimpleJobSerializer),
  marketing: ActiveModel::ArraySerializer.new(@marketing_jobs, each_serializer: SimpleJobSerializer),
  sales: ActiveModel::ArraySerializer.new(@sales_jobs, each_serializer: SimpleJobSerializer)
}

render json: @jobs