【问题标题】:Serialize array/relation with attributes using ActiveModel::Serializer使用 ActiveModel::Serializer 使用属性序列化数组/关系
【发布时间】:2013-09-02 10:10:25
【问题描述】:

我想使用 Active Model Serializers 序列化关系,并且我想为此关系设置一些“全局”属性(例如计数):

{
  users: {
    total: 12,
    page: 2,
    users: [{}, {}, {}, ...]
  }
}

我该怎么做?

【问题讨论】:

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


    【解决方案1】:

    在控制器中调用渲染期间,您可以传入元属性。

    render @users, :each_serializer => UserSerializer, :meta => { :total => @users.count }
    

    这将产生以下 JSON:

    {
      "users" : [...],
      "meta" : {
        "total" : 12
      }
    }
    

    您可以通过传入meta_key 选项来重命名元键名称。

    【讨论】:

    • 这是 JSONAPI 规范的正确 json 结构,所以这是你应该返回以符合规范 - 元属性
    • 请注意,如果您因调用父序列化程序而触发此代码(您将为每个父序列触发计数查询),这确实与@Stanislav 的答案具有相同的数据库影响。在非常大的数据集(可能有数百万行)上,这会变慢。只是说':)
    【解决方案2】:

    您可以在序列化程序中定义计算属性:

    class FooSerializer < ActiveModel::Serializer
      attributes :users_count
      has_many :users
    
      def users_count
        object.users.size
      end
    end
    

    【讨论】:

    • 这适用于小型数据集。请注意,这将为每个 Foo 触发用户计数查询。因此,当点击 foo/index 路由时,如果您返回 100 个 foo:一个查询以获取 Foos,然后是 100 "select count(*) from users where foo.id=x"
    【解决方案3】:

    正如指出的那样,这不会对count 进行多次数据库调用 @rmcshry

     { 
        data: ActiveModelSerializers::SerializableResource.new(
                @users, each_serializer: UserSerializer).as_json,
        count: @users.count 
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 2013-07-06
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      相关资源
      最近更新 更多