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のembedメソッドがincludeオプションでモデルのリストを受け入れた場合、これはJSON応答をフィルタリングしてサイドロードされたコメントのみを含めることができます。
- Emberデータのモデルは、「users」、「reporters」、「assignees」からユーザーをサイドロードするように構成できます...しかし、ソースからわかる限り、sideloadAの1つのキーしかサポートしていないようです。
- どういうわけか、未知のキーのサイドローディングエラーを無視/無効にします(おそらく最も賢明でないアプローチ)。
私がここで見逃している別のオプションはありますか?修正を記述して、rails-api / active_model_serializers、emberjs / data、またはその両方にプルリクエストを送信する必要があると思います。
編集:これに対する私の一時的な回避策は、IssueSerializerを変更して、レポーターと担当者のIDのみをシリアル化することです。
class IssueSerializer < ActiveModel::Serializer
attributes :id, :reporter_id, :assignee_id
embed :ids, include: true
has_many :comments, :embed => :ids
end