Ho un paio di modelli in Rails che sembrano qualcosa di simile:oggetti a caricamento laterale con i nomi di classe non-standard in EmberJS con Rails + active_model_serializers
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 serializzatori in questo modo:
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
Questo produce JSON che sembra qualcosa di simile al seguente:
{
"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"
}
]
}
il problema è che il giornalisti laterali-caricato e gli oggetti JSON assegnatari non sono riconosciuti dal Ember come oggetti Utente, e vedo il seguente errore:
Uncaught Error: assertion failed: Your server returned a hash with the key reporters but you have no mapping for it
Non voglio rimuovere
embed :ids, include: true
dal mio IssueSerializer, perché quindi i commenti non sarebbero serializzati.
ci sono alcuni possibili modi per risolvere questo che ho considerato:
- Se il metodo embed per ActiveModel :: Serializzatore accettato un elenco di modelli nella sua includere un'opzione, questo potrebbe filtrare la risposta JSON includere solo commenti caricati lateralmente.
- Il modello dei dati di brace potrebbe essere configurato per caricare gli utenti da "utenti", "reporter" e "assegnatari" ... ma, per quanto posso dire dalla sorgente, sembra che supporti solo una chiave per sideloadAs.
- In qualche modo ignora/disabilita gli errori di caricamento laterale per le chiavi sconosciute (probabilmente l'approccio meno sano).
C'è un'altra opzione che mi manca qui? Penso che potrei dover scrivere una correzione e inviare una richiesta pull a rails-api/active_model_serializers, emberjs/data o entrambi.
EDIT: La mia soluzione temporanea per questo è di cambiare l'IssueSerializer per serializzare solo gli ID per i reporter e assegnatario:
class IssueSerializer < ActiveModel::Serializer
attributes :id, :reporter_id, :assignee_id
embed :ids, include: true
has_many :comments, :embed => :ids
end
Potrebbe mostrare il modello di emissione? –
La tua risposta qui sotto è corretta. – benburton
Quale versione di Ember-data stai usando? –