序列化嵌套属性Active Model Serializer

时间:2018-03-24 12:27:22

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

我有以下代码,似乎无法按照我的序列化程序输出我的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对象中,停止序列化。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

@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

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

@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

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

import com.mongodb.Mongo;
import io.dropwizard.lifecycle.Managed;

public class MongoManaged implements Managed {

private Mongo mongo;

public MongoManaged(Mongo mongo) {
    this.mongo = mongo;
}

@Override
public void start() throws Exception {
}

@Override
public void stop() throws Exception {
    mongo.close();
}
}