ActiveModel Serializer отправляет все записи вместо указанного ограниченного количества

У меня есть контроллер, который выглядит так:

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 ответ

Решение

Ознакомьтесь с руководствами по ассоциациям:

По умолчанию сериализаторы просто ищут ассоциацию с исходным объектом. Вы можете настроить это поведение, реализуя метод с именем ассоциации и возвращая другой массив.

Таким образом, каждая модель сериализуется в соответствии со своим сериализатором. Ваш organization модели проходили через ваш OrganizationSerializer, который имел has_many :metrics указано. Таким образом, рельсы посмотрели все показатели для этой организации и сериализовали их.

Вы не хотели этого, вы просто заботились об одной организации, к которой принадлежала метрика. Так что просто удалите эту строку, и рельсы не будут сериализовать остальные.

Другие вопросы по тегам