Objetos de carregamento lateral com nomes de classe não padrão em EmberJS com Rails + active_model_serializers
Eu tenho alguns modelos no Rails que são parecidos com isto:
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
com serializadores assim:
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
Isso produz JSON que se parece com o seguinte:
{
"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"
}
]
}
O problema é que os objetos JSON de repórteres e destinatários carregados de lado não são reconhecidos pelo Ember como objetos User e vejo o seguinte erro:
Uncaught Error: assertion failed: Your server returned a hash with the key reporters but you have no mapping for it
Não quero remover
embed :ids, include: true
do meu IssueSerializer, porque os comentários não seriam serializados.
Existem algumas maneiras possíveis de resolver isso que eu considerei:
Se o método embed para ActiveModel :: Serializer aceitasse uma lista de modelos em sua opção include, isso poderia filtrar a resposta JSON para incluir somente comentários com carga lateral.O modelo de dados da Ember pode ser configurado para carregar usuários de "usuários", "repórteres" e "responsáveis" ... mas, até onde eu sei, a fonte só parece suportar uma chave para sideloadAs.De alguma forma, ignore / desative erros de carregamento lateral para chaves desconhecidas (provavelmente a abordagem menos sensata).Existe outra opção que estou perdendo aqui? Acho que posso ter que escrever uma correção e enviar uma solicitação pull para rails-api / active_model_serializers, emberjs / data ou ambos.
EDITAR: Minha solução temporária para isso é alterar o IssueSerializer para apenas serializar os IDs para o repórter e o responsável:
class IssueSerializer < ActiveModel::Serializer
attributes :id, :reporter_id, :assignee_id
embed :ids, include: true
has_many :comments, :embed => :ids
end