У меня есть несколько моделей в Rails, которые выглядят примерно так:
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
с такими сериализаторами:
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
Это создает JSON, который выглядит примерно так:
{
"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"
}
]
}
Проблема в том, что загруженные неопубликованные объекты JSON репортеров и уполномоченных не распознаются Ember как объекты пользователя, и я вижу следующую ошибку:
Uncaught Error: assertion failed: Your server returned a hash with the key reporters but you have no mapping for it
я не хочу удалять
embed :ids, include: true
из моего IssueSerializer, потому что тогда комментарии не будут сериализованы.
Есть несколько потенциальных способов решить эту проблему, которые я рассматривал:
- Если бы метод встраивания для ActiveModel::Serializer принимал список моделей в своем параметре include, это могло бы фильтровать ответ JSON, чтобы включать только загруженные неопубликованные комментарии.
- Модель данных Ember может быть настроена на боковую загрузку пользователей из «пользователей», «репортеров» и «правопреемников»… но, насколько я могу судить из источника, она поддерживает только один ключ для sideloadAs.
- Каким-то образом игнорировать/отключать ошибки боковой загрузки для неизвестных ключей (вероятно, наименее разумный подход).
Есть ли еще один вариант, который мне здесь не хватает? Я думаю, мне, возможно, придется написать исправление и отправить запрос на включение либо в rails-api/active_model_serializers, либо в emberjs/data, либо в оба.
EDIT: мой временный обходной путь для этого — изменить IssueSerializer, чтобы сериализовать только идентификаторы для репортера и правопреемника:
class IssueSerializer < ActiveModel::Serializer
attributes :id, :reporter_id, :assignee_id
embed :ids, include: true
has_many :comments, :embed => :ids
end