假设有两个表项目和进度,而一个项目有很多进度(从多到多):
jq
我确实定义了ProjectSerializer,如下所示:
class Project < ApplicationRecord
has_many :progresses
end
class Progress < ApplicationRecord
belongs_to :project
end
此外,我像这样在控制器中初始化我的序列化器:
class ProjectSerializer < ApplicationSerializer
attributes :title, :state, :tags # and so on
attribute :lateset_progress
def lateset_progress
object.progresses.order(created_at: :desc).first
end
end
问题在于,嵌套的lastest_progress不能由序列化程序处理,并且不会用下划线呈现所有属性。
真正的响应数据是:
def show
project = Project.find(params[:id])
resource = ActiveModelSerializers::SerializableResource.new(
project, key_transform: :camel_lower, adapter: :json)
render json: resource
end
答案 0 :(得分:1)
您可以使用类似这样的内容:
class ProjectSerializer < ApplicationSerializer
...
has_many :progresses, key: :lateset_progress do
object.progresses.order(created_at: :desc).first
end
...
end
如果需要自定义序列化程序类,则可以使用其他选项。例如:has_many :progresses, key: :lateset_progress, serializer: CustomProgressSerializer do ...
有关key_transform的第二部分。我不确定ActiveModelSerializers::SerializableResource
实例的渲染方式如何工作,但是我在文档中看到了一些示例,其中这些选项用于渲染方法rendering docs
从自我出发,我建议使用此表示法
json_data = ActiveModelSerializers::SerializableResource.new(project,
key_transform: :camel_lower, adapter: :json
).as_json
通过as_json
和fileds: [...]
选项,您可以管理attrs列表,它的作用类似于'only'。
例如as_json(fields: [:id, :updated_at])
但是要小心:如果您使用其他方式创建序列化程序对象,则args的顺序可能会有所不同。
ProjectSerializer.new(project).as_json(nil, fields: [:id, :status])
对于0.10.x版,所有所说的都是事实