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
указано. Таким образом, рельсы посмотрели все показатели для этой организации и сериализовали их.
Вы не хотели этого, вы просто заботились об одной организации, к которой принадлежала метрика. Так что просто удалите эту строку, и рельсы не будут сериализовать остальные.