Загрузка объектов с нестандартными именами классов в EmberJS с помощью Rails + active_model_serializer
У меня есть несколько моделей в 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 принял список моделей в своем параметре включения, это может отфильтровать ответ JSON, чтобы включить только комментарии с боковой загрузкой.Модель данных Ember может быть настроена для боковой загрузки пользователей из «users», «reporters» и «assignees» ... но, насколько я могу судить из источника, кажется, что поддерживается только один ключ для sideloadAs.Каким-то образом игнорируйте / отключайте ошибки боковой загрузки для неизвестных ключей (вероятно, наименее вменяемый подход).Есть ли другой вариант, который я здесь упускаю? Я думаю, что мне, возможно, придется написать исправление и отправить запрос на выборку либо rails-api / active_model_serializers, emberjs / data, либо обоим.
РЕДАКТИРОВАТЬМой временный обходной путь для этого состоит в том, чтобы изменить IssueSerializer, чтобы только сериализовать идентификаторы для репортера и уполномоченного:
class IssueSerializer < ActiveModel::Serializer
attributes :id, :reporter_id, :assignee_id
embed :ids, include: true
has_many :comments, :embed => :ids
end