ActiveModel Serializer发送所有记录而不是指定的有限数量

时间:2014-11-19 15:25:00

标签: ruby-on-rails ruby ember.js ember-data active-model-serializers

我有一个看起来像这样的控制器:

class MetricsController < ApplicationController
  def index
    org = current_user.organization
    metrics = Metric.where(organization: org).last(100)
    render json: metrics, status: 200, include: [:organization]
  end
end

指标模型:

class Metric < ActiveRecord::Base
  belongs_to :organization
end

组织:

class Organization < ActiveRecord::Base
  has_many :metrics
end

MetricSerializer:

class MetricSerializer < ActiveModel::Serializer
  embed :ids
  attributes :id, :provisioned_users, :connected_users, :created_at

  has_one :organization

end

OrganizationSerializer:

class OrganizationSerializer < ActiveModel::Serializer
  attributes :id, :name, :org_id, :gauth_enabled

  has_many :metrics
end

虽然返回了JSON

organizations: [
  {
    id: 1,
    name: "ACME",
    org_id: "org_id232323",
    gauth_enabled: "f",
    metric_ids: [
      1,
      2,
      3,
      ...
      1000
    ]
  }
],

正如你所看到的那样,我的序列化程序正在吐出公制表中的每一条记录,当时我可能只想要最后的100条。我不确定我在AMS中设置了什么错误(0.8 )。

有趣的是,我的rails控制台显示了具有正确限制的正确SQL:

Metric Load (0.7ms)  SELECT  "metrics".* FROM "metrics"   ORDER BY "metrics"."id" DESC LIMIT 100
  Organization Load (0.3ms)  SELECT  "organizations".* FROM "organizations"  WHERE "organizations"."id" = $1 LIMIT 1  [["id", 1]]

1 个答案:

答案 0 :(得分:3)

查看associations上的指南:

  

默认情况下,序列化程序只是查找原始对象上的关联。您可以通过实现具有关联名称的方法并返回不同的数组来自定义此行为。

因此,每个模型都根据其序列化程序进行序列化。您的organization模型正在通过指定OrganizationSerializer的{​​{1}}。因此,rails查找该组织的所有指标,并将其序列化。

你不想要那个,你只关心这个指标所属的那个组织。因此,只需删除该行,并且rails不会将其余行序列化。