Side-loading objects with non-standard class names in EmberJS with Rails+active_model_serializers

active-model-serializers, ember-data, ember.js

Solution

I had similar problem and have found solution at ActiveModel::Serializers readme. You can use `:root` option. Try something like this for issue serializer:

class IssueSerializer < ActiveModel::Serializer
  attributes :id
  embed :ids, include: true

  has_one :reporter, :root => "users"
  has_one :assignee, :root => "users"
  has_many :comments
end

Problem

I have a few models in Rails that look something like this: ``` 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 ``` with serializers like so: ``` 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 ``` This produces JSON that looks something like the following: ``` { "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" } ] } ``` The problem is that the side-loaded reporters and assignees JSON objects aren't recognized by Ember as User objects, and I see the following error: ``` Uncaught Error: assertion failed: Your server returned a hash with the key reporters but you have no mapping for it ``` I don't want to remove ``` embed :ids, include: true ``` from my IssueSerializer, because then the comments wouldn't be serialized. There are a few potential ways to solve this that I've considered: - If the embed method for ActiveModel::Serializer accepted a list of models in its include option, this could filter the JSON response to only include side-loaded comments. - Ember data's model could be configured to side load users from "users", "reporters" and "assignees"... but as far as I can tell from the source it only appears to support one key for sideloadAs. - Somehow ignore/disable side-loading errors for unknown keys (probably the least sane approach). Is there another option I'm missing here? I think I may have to write a fix and submit a pull request to either rails-api/active_model_serializers, emberjs/data, or both. EDIT: My temporary workaround for this is to change the IssueSerializer to only serialize the ids for reporter and assignee: ``` class IssueSerializer < ActiveModel::Serializer attributes :id, :reporter_id, :assignee_id embed :ids, include: true has_many :comments, :embed => :ids end ```

Original source