Ember,Ember Data和MongoDB的_id

Cha*_*had 8 mongoose mongodb ember.js ember-data

我已经看到了这个问题谈过,但我仍然有粗暴对待蒙戈的问题_id到id.我使用mongoose作为我的ORM,虽然它有虚拟,我似乎无法让它正常工作.以下是我的猫鼬模型中的内容.

尝试从后端修复

mongoose = require 'mongoose'
Schema = mongoose.Schema
ObjectId = Schema.ObjectId

ApartmentSchema = new Schema
  body: String
  date: { type: Date, default: Date.now }
  deleted: {type: Boolean, default: false}
  saved: {type: Boolean, default: false}
  visited: {type: Boolean, default: false}
  email: String
  phoneNumber: String
  href: String

ApartmentSchema.virtual('id').get -> return @_id

module.exports = mongoose.model 'Apartment', ApartmentSchema
Run Code Online (Sandbox Code Playgroud)

当我在Express中创建这个模型的新实例时,我可以查看apt.id并获取id,但是当我将响应发送到客户端时,我只是拥有_id而不是id.

我尝试的第二个解决方案是创建一个计算属性,id但无论出于什么原因,ember都不喜欢这个.这里有两个问题.Ember不尊重被称为id或至少不再被计算的属性.这就是我的余烬数据模型.

尝试从前端修复它

App.Apartment = DS.Model.extend({
  body: DS.attr('string'),
  date: DS.attr('date'),
  deleted: DS.attr('boolean'),
  saved: DS.attr('boolean'),
  visited: DS.attr('boolean'),
  email: DS.attr('string'),
  phone: DS.attr('string'),
  _id: DS.attr('string'),
  id : function () {
    return this.get('_id')
  }.property('_id')
});
Run Code Online (Sandbox Code Playgroud)

在我的模板下面,没有任何渲染id.

{{#each apartment in controller}}
    <li>{{apartment.body}} | {{apartment.date}} | {{apartment.href}} {{apartment.id}}</a>  {{#linkTo 'apartment' apartment }} View {{/linkTo}} </li>
{{/each}}
Run Code Online (Sandbox Code Playgroud)

该linkTo助手的工作,但该网址具有零其中ID应该是.这导致后退按钮断开并多次加载数据.以下是我的路由器的一些上下文.

App.Router.map(function(){
  this.resource('apartments', function (){
    this.resource('apartment', { path: ':apartment_id' } );
  });
});
Run Code Online (Sandbox Code Playgroud)

将我的计算id属性的名称更改为类似的foo,然后将我的路由器更改为path: ':apartment_foo'在url中具有对象引用的url结果,例如:#/apartments/<App.Apartment:ember357:null>.

像这样的东西让我想起了余烬.任何帮助,将不胜感激.

Cha*_*had 9

从Ember 1.0.0-rc 1和Ember Data修订版11开始,这似乎是解决此问题的最佳方法.

App.Adapter = DS.RESTAdapter.extend({
  serializer: DS.RESTSerializer.extend({
    primaryKey: function(type){
      return '_id';
    }
  })
});

App.Store = DS.Store.extend({
  revision: 11,
  adapter: 'App.Adapter'
});
Run Code Online (Sandbox Code Playgroud)


cla*_*mes 7

截至Ember Data - Version:v1.0.0-beta.2,我能够做到以下几点:

App.ApplicationSerializer = DS.RESTSerializer.extend({
  primaryKey: "_id"
});
Run Code Online (Sandbox Code Playgroud)

我对Ember很新,所以这可能不是最好的方法,但它有效!


owe*_*rme 5

我和Chris有同样的问题,ID看起来像这样:

"_id":{"$oid":"52772aa44f6c6c5dd0000000"}
Run Code Online (Sandbox Code Playgroud)

将$ oid部分添加到claptimes的解决方案对我有用.

App.ApplicationSerializer = DS.RESTSerializer.extend({
  primaryKey: "_id.$oid"
});
Run Code Online (Sandbox Code Playgroud)