Ich Rails 4.2.1
und active_model_serializers 0.10.0.rc2
Serialisierung tief verschachtelte Assoziationen mit active_model_serializers
mit Ich bin neu in API und wählte active_model_serializers
, weil es immer mehr zum Standard für Schienen zu sein scheint (Obwohl ich nicht auf der Verwendung RABL
Gegensatz bin oder ein anderer Serialisierer)
Das Problem, das ich habe, ist, dass ich nicht scheinen kann, verschiedene Attribute in Multilevelbeziehungen einzuschließen. Zum Beispiel habe ich:
Projekte
class ProjectSerializer < ActiveModel::Serializer
attributes :id,
:name,
:updated_at
has_many :estimates, include_nested_associations: true
end
und
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
Vorschläge
class ProposalSerializer < ActiveModel::Serializer
attributes :id,
:name,
:updated_at,
:estimate_id
belongs_to :estimate
end
Schätzungen Wenn Ich schlug die /projects/1
die oben erzeugt:
{
"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
}
]
}
Aber was ich mag würde es produzieren:
{
"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"
}
]
}
]
}
Idealerweise würde ich auch in der Lage sein möchten angeben, welche Attribute, Verbände und Attribute dieser Zuordnungen, die in jedem Serializer enthalten sind.
Ich habe durch die AMS-Probleme geschaut, und es scheint einige hin und her zu geben, wie dies behandelt werden sollte (oder wenn diese Art von Funktionalität sogar tatsächlich unterstützt wird), aber ich habe Schwierigkeiten herauszufinden genau wie der aktuelle Zustand ist.
- 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
Eine der vorgeschlagenen Lösungen war das Attribut mit einer Methode zu überschreiben die verschachtelten Attribute zu nennen, aber das scheint zu betrachten als Hack, also wollte ich es möglichst vermeiden.
Wie auch immer, ein Beispiel dafür, wie man diesen oder einen allgemeinen API-Rat einhält, wäre sehr willkommen.
Es sieht vielleicht aus wie eine fieses Workaround, aber Sie haben mich gerettet !!!!! – yossico
Bravo auf Ruby und was AMS gibt Ihnen, was Sie wollen! – BF4
Während die meisten Antworten auf diese Frage die richtige * konventionelle * Art ist, ist es schwer zu bekommen, was Sie wollen, wenn Sie den AMS-Konventionen folgen. Ich schreibe auch meine eigenen Rückrufe für die Anzeige von verschachtelten Assoziationen und finde die AMS-Konvention zu unhandlich. Ich finde, dass dies für so ziemlich alles, was Rails und verschachtelte Assoziationen betrifft, der Fall ist - Konventionen sind unhandlich, schieben sich auf einfachen Rubin. – Todd