序列化嵌套属性 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 回复,但预计只会收到 title
、company
、job_type
和 date
。
值得一提的是,工作模型是完全扁平化的,目前没有任何关联需要考虑。似乎只是将作业嵌套到停止序列化的@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
我有以下代码,但似乎无法让我的 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 回复,但预计只会收到 title
、company
、job_type
和 date
。
值得一提的是,工作模型是完全扁平化的,目前没有任何关联需要考虑。似乎只是将作业嵌套到停止序列化的@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