7

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
4

3 に答える 3

1

このページを読む必要があります。Revision 12 のセクションでは、同じタイプのデータのサイドローディングについて説明しています。

これで、homeAddress と workAddress は同じタイプであるため、アドレスとして一緒にサイドロードされることが期待されます。さらに、デフォルトのルート命名規則 (アンダースコアと小文字) が、サイドロードされたルート名にも適用されるようになりました。

モデルは次のようになります。

App.Issue  = DS.Model.extend({
  reporter: DS.belongsTo('App.User'),
  assignee: DS.belongsTo('App.User'),
  comments: DS.hasMany('App.Comment')
});

JSON Result には、ユーザーのキーが含まれている必要があります。

{
  "issues": [
    {
      "id": 6,
      "reporter_id": 1,
      "assignee_id": 2,
      "comment_ids": [
        3
      ]
    },
  ],
  "comments": [
    {
      "id": 3
      "body": "Great comment"
    }
  ],
  "users": [
    {
      "id": 1
      "name": "Ben Burton"
    },{
      "id": 2
      "name": "Jono Mallanyk"
    }
  ]
}

reporterが typeであることをモデルで構成したためUser、Ember は結果でユーザーを検索します。

于 2013-03-12T18:55:42.270 に答える