Ember-data and MongoDB, how to handle _id

2020-06-03 06:29发布

I'm using ember-data with rails and MongoDB and am having problem with the way IDs are stored in MongoDB - in a _id field.

Ember-data will use id as the default field for ID so I tried to override it like this:

App.User = DS.Model.extend
    primaryKey: "_id"
    name: DS.attr "string"
    image: DS.attr "string"

This seems to work most of the time but in some instances I get exceptions from ember saying:

Uncaught Error: assertion failed: Your server returned a hash with the key _id but you have no mappings

I suspect this might be a bug in ember-data because it's still heavily under development, but I was trying to find a way to get to map _id to id on the server side in rails? I'm using mongoid to do the mongo mapping.

9条回答
我想做一个坏孩纸
2楼-- · 2020-06-03 07:19

Ahh, instead of including _id in your JSON, you could craft the JSON to instead use the id method rather than the _id attribute. Ways:

You could use rabl, and the JSON could be like:

object @user 
attributes :id, :email
node(:full_name) {|user| "#{user.first_name} #{user.last_name}"}

You could also craft the as_json method

class User
  def as_json(args={})
    super args.merge(:only => [:email], :methods => [:id, :full_name])
  end
end
查看更多
仙女界的扛把子
3楼-- · 2020-06-03 07:24

I had a similar problem using ember.js with ember-resource and couchdb, which also stores it's IDs as _id.

As solution to this problem I defined a superclass for all my model classes containing a computed property to duplicate _id into id like this:

// get over the fact that couchdb uses _id, ember-resource uses id
id: function(key, value) {
    // map _id (couchdb) to id (ember)
    if (arguments.length === 1) {
        return this.get('_id');
    }
    else {
        this.set('_id', value);
        return value;
    }
}.property('_id').cacheable()

Maybe this could solve your problem too?

查看更多
我想做一个坏孩纸
4楼-- · 2020-06-03 07:24

If you use Mongoid3, here is the monkey patch may work for you.

https://gist.github.com/4700909

查看更多
登录 后发表回答