我有一个看起来像这样的控制器:
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]]
答案 0 :(得分:3)
查看associations上的指南:
默认情况下,序列化程序只是查找原始对象上的关联。您可以通过实现具有关联名称的方法并返回不同的数组来自定义此行为。
因此,每个模型都根据其序列化程序进行序列化。您的organization
模型正在通过指定OrganizationSerializer
的{{1}}。因此,rails查找该组织的所有指标,并将其序列化。
你不想要那个,你只关心这个指标所属的那个组织。因此,只需删除该行,并且rails不会将其余行序列化。