【问题标题】:Order_by Rails Serializer transformationOrder_by Rails 序列化器转换
【发布时间】:2018-04-12 00:06:11
【问题描述】:

我的理解是,你只能在像这样使用渲染时调用 AMS:

render json: foos, each_serializer: FoosSerializer

但是,如果我想在序列化资源的结果被序列化后对它做些什么呢?那可能吗?我的问题是我的序列化程序调用资源上的一个方法来转换资源的一个属性,我需要在将其传递到前端之前按该属性排序。

当我执行以下操作时:

ActiveModel::SerializableResource.new(
  foos, 
  each_serializer: FoosSerializer
).to_json

我得到了 json,但我可以将它转换回我可以调用 order_by 的东西吗?

编辑:

我有这个:

JSON.parse(ActiveModel::SerializableResource.new(
        foos, 
        each_serializer: FoosSerializer
      ).to_json).sort {|x,y| x[:name] <=> y[:name]}

但是调用to_jsonparse 来调用顺序似乎很愚蠢,因为我仍然需要在病房后对解析的结果做一些事情。

【问题讨论】:

  • foo 是一个集合吗?
  • @AnkitG 是的,这是一个集合

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


【解决方案1】:

如何创建另一个转换器序列化器为FooSortSerializer

class FooSortSerializer < ActiveModel::Serializer

  def attributes(_options = {}, _reload = false)
    object.collect do |foo_instance|
       FooSerializer.new(foo_instance).attributes
    end.sort {|x,y| x[:name] <=> y[:name]
  end
end

在控制器中

render json: foos, serializer: FooSortSerializer

【讨论】:

  • 对不起,我误读了您之前的问题, foo 不是一个集合。它是具有我想要排序的属性的资源,例如名称。该名称属性由序列化程序转换,所以我想在转换后排序
  • 您提供的答案在资源中排序,而不是与资源之间的相互关系
  • 它将首先序列化所有资源,然后对输出进行排序。我在我的回答中添加了你正在做的那种。您还可以在序列化 IMO 之前对对象进行排序
  • 我收到了NoMethodError (undefined method merge for nil:NilClass):
  • 我认为问题在于我要返回一个对象数组,但 Rails 想要一个 AR 对象数组
猜你喜欢
  • 2013-05-15
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多