Objetos de carga lateral con nombres de clase no estándar en EmberJS con Rails + active_model_serializers
Tengo algunos modelos en Rails que se parecen a esto:
class Issue < ActiveRecord::Base
belongs_to :reporter, class_name: 'User'
belongs_to :assignee, class_name: 'User'
has_many :comments
end
class User < ActiveRecord::Base
end
class Comment < ActiveRecord::Base
end
con serializadores como tal:
class IssueSerializer < ActiveModel::Serializer
attributes :id
embed :ids, include: true
has_one :reporter, :embed => :ids
has_one :assignee, :embed => :ids
end
class UserSerializer < ActiveModel::Serializer
attributes :id, :name
end
class CommentSerializer < ActiveModel::Serializer
attributes :id, :body
end
Esto produce JSON que se parece a lo siguiente:
{
"issues": [
{
"id": 6,
"reporter_id": 1,
"assignee_id": 2,
"comment_ids": [
3
]
},
],
"comments": [
{
"id": 3
"body": "Great comment"
}
],
"reporters": [
{
"id": 1
"name": "Ben Burton"
}
],
"assignees": [
{
"id": 2
"name": "Jono Mallanyk"
}
]
}
El problema es que los objetos JSON asignados a los reporteros y asignados de lado no son reconocidos por Ember como objetos de Usuario, y veo el siguiente error:
Uncaught Error: assertion failed: Your server returned a hash with the key reporters but you have no mapping for it
No quiero remover
embed :ids, include: true
de mi IssueSerializer, porque entonces los comentarios no serían serializados.
Hay algunas formas potenciales de resolver esto que he considerado:
Si el método de inserción para ActiveModel :: Serializer aceptó una lista de modelos en su opción de inclusión, esto podría filtrar la respuesta JSON para incluir solo los comentarios cargados lateralmente.El modelo de datos de Ember podría configurarse para cargar de lado a los usuarios de "usuarios", "reporteros" y "asignados" ... pero, por lo que puedo decir de la fuente, solo parece admitir una tecla para sideloadAs.De alguna manera, ignore / deshabilite los errores de carga lateral para claves desconocidas (probablemente el enfoque menos sensato).¿Hay otra opción que me falta aquí? Creo que es posible que tenga que escribir una solución y enviar una solicitud de extracción a cualquiera de rails-api / active_model_serializers, emberjs / data, o ambos.
EDITAR: Mi solución temporal para esto es cambiar el IssueSerializer para que solo serialice los identificadores para el reportero y el asignado:
class IssueSerializer < ActiveModel::Serializer
attributes :id, :reporter_id, :assignee_id
embed :ids, include: true
has_many :comments, :embed => :ids
end