Я использую Rails 4.2.1
и active_model_serializers 0.10.0.rc2
Я новичок в API и выбрал active_model_serializers
, потому что он, похоже, становится стандартом для рельсов (хотя я не против использования RABL
или другого сериализатора)
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу включить различные атрибуты в многоуровневые отношения. Например, у меня есть:
Проекты
class ProjectSerializer < ActiveModel::Serializer
attributes :id,
:name,
:updated_at
has_many :estimates, include_nested_associations: true
end
и Оценки
class EstimateSerializer < ActiveModel::Serializer
attributes :id,
:name,
:release_version,
:exchange_rate,
:updated_at,
:project_id,
:project_code_id,
:tax_type_id
belongs_to :project
belongs_to :project_code
belongs_to :tax_type
has_many :proposals
end
Предложения
class ProposalSerializer < ActiveModel::Serializer
attributes :id,
:name,
:updated_at,
:estimate_id
belongs_to :estimate
end
Когда я нажму на /projects/1
, вы получите:
{
"id": 1,
"name": "123 Park Ave.",
"updated_at": "2015-08-09T02:36:23.950Z",
"estimates": [
{
"id": 1,
"name": "E1",
"release_version": "v1.0",
"exchange_rate": "0.0",
"updated_at": "2015-08-12T04:23:38.183Z",
"project_id": 1,
"project_code_id": 8,
"tax_type_id": 1
}
]
}
Однако, я бы хотел, чтобы он производил:
{
"id": 1,
"name": "123 Park Ave.",
"updated_at": "2015-08-09T02:36:23.950Z",
"estimates": [
{
"id": 1,
"name": "E1",
"release_version": "v1.0",
"exchange_rate": "0.0",
"updated_at": "2015-08-12T04:23:38.183Z",
"project": {
"id": 1,
"name": "123 Park Ave."
},
"project_code": {
"id": 8,
"valuation": 30
},
"tax_type": {
"id": 1,
"name": "no-tax"
},
"proposals": [
{
"id": 1,
"name": "P1",
"updated_at": "2015-08-12T04:23:38.183Z"
},
{
"id": 2,
"name": "P2",
"updated_at": "2015-10-12T04:23:38.183Z"
}
]
}
]
}
В идеале я также хотел бы указать, какие атрибуты, ассоциации и атрибуты этих ассоциаций включены в каждый сериализатор.
Я просматривал проблемы AMS, и, похоже, некоторые из них обращаются к тому, как это следует обрабатывать (или если эта функциональность даже поддерживается на самом деле), но мне трудно понять, что именно каково текущее состояние.
- https://github.com/rails-api/active_model_serializers/issues/835
- https://github.com/rails-api/active_model_serializers/issues/968
- https://github.com/rails-api/active_model_serializers/issues/414
- https://github.com/rails-api/active_model_serializers/issues/444
Одно из предлагаемых решений заключалось в том, чтобы переопределить атрибут методом вызова вложенных атрибутов, но это кажется расцененным как хак, поэтому я хотел избежать его, если это возможно.
В любом случае, пример того, как об этом или общем совете API, заслуживает высокой оценки.