Rails活动模型序列化器如何处理嵌套资源?

时间:2018-07-10 07:45:46

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

假设有两个表项目和进度,而一个项目有很多进度(从多到多):

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

1 个答案:

答案 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_jsonfileds: [...]选项,您可以管理attrs列表,它的作用类似于'only'。 例如as_json(fields: [:id, :updated_at])

但是要小心:如果您使用其他方式创建序列化程序对象,则args的顺序可能会有所不同。

ProjectSerializer.new(project).as_json(nil, fields: [:id, :status])

对于0.10.x版,所有所说的都是事实