【问题标题】:Ember, Ember Data and MongoDB's _idEmber、Ember Data 和 MongoDB 的 _id
【发布时间】:2013-03-12 14:56:01
【问题描述】:

我已经看到有人讨论过这个问题,但我仍然在将 Mongo 的 _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

当我在 express 中创建此模型的新实例时,我可以像 apt.id 一样查找并取回 id,但是当我将响应发送给客户端时,我只有 _id 而不是 @987654326 @。

我尝试的第二个解决方案是为id 创建一个计算属性,但无论出于何种原因,ember 都不喜欢这样。这里有2个问题。 Ember 不尊重名为 id 的计算属性,或者至少不再尊重。这就是我的 ember-data 模型的样子。

尝试从前端修复它

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')
});

在我下面的模板中,没有为 id 呈现任何内容。

{{#each apartment in controller}}
    <li>{{apartment.body}} | {{apartment.date}} | {{apartment.href}} {{apartment.id}}</a>  {{#linkTo 'apartment' apartment }} View {{/linkTo}} </li>
{{/each}}

linkTo 助手可以工作,但 url 的 id 应该是 null。这会导致后退按钮中断并多次加载数据。下面是我的路由器的一些上下文。

App.Router.map(function(){
  this.resource('apartments', function (){
    this.resource('apartment', { path: ':apartment_id' } );
  });
});

将我计算的id 属性的名称更改为foo 之类的名称,然后将我的路由器更改为path: ':apartment_foo' 会导致URL 中包含对象引用,例如:#/apartments/&lt;App.Apartment:ember357:null&gt;

像这样的东西让我对 ember 感到很恼火。任何帮助,将不胜感激。

【问题讨论】:

    标签: mongodb ember.js mongoose ember-data


    【解决方案1】:

    从 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'
    });
    

    【讨论】:

    • 对我来说,这会将路由的 null 部分更改为 [object Object],因为 BSON 对象 ID 序列化为对象(例如 "_id":{"$oid": "5147130ffddd310aeb000001"})。您的原始问题中是否有将其转换为字符串的修复程序?
    【解决方案2】:

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

    App.ApplicationSerializer = DS.RESTSerializer.extend({
      primaryKey: "_id"
    });
    

    我对 Ember 还很陌生,所以这可能不是最好的方法,但它确实有效!

    【讨论】:

    • 搜索了几个小时后,这是唯一对我有用的,谢谢
    • Ember 数据最近减少了可访问方法的数量,这似乎没有记录,但主键属性是通过 this private method 访问。
    【解决方案3】:

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

    "_id":{"$oid":"52772aa44f6c6c5dd0000000"}
    

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

    App.ApplicationSerializer = DS.RESTSerializer.extend({
      primaryKey: "_id.$oid"
    });
    

    【讨论】:

    • 几乎对我有用,但似乎 id 仍然没有返回(尽管所有其他数据都返回了)。
    • 我在 Mongodb 和 ember-data 之间遇到了类似的问题,如果有人想看看:stackoverflow.com/questions/20544371/…
    【解决方案4】:

    自从迁移到 Ember-CLI 后,这个过程略有改变。你现在想要这样做:

    1. 从 Ember-CLI 项目命令行:

      ember g serializer application
      
    2. 让你新创建的序列化器看起来像这样:

      import DS from 'ember-data';
      
      export default DS.RESTSerializer.extend({
        primaryKey: '_id'
      });
      

    【讨论】:

      【解决方案5】:

      从 Ember 2.0.0 开始,规范化 Mongo ID 的正确方法是在序列化程序中使用 extractId。这是针对 Rails/Grape API 运行的 RESTSerializer 的示例:

      import DS from 'ember-data';
      
      export default DS.RESTSerializer.extend({
        isNewSerializerAPI: true,
        extractId: function (modelClass, resourceHash) {
          return resourceHash.id.$oid;
        }
      });
      

      请注意,您必须将 isNewSerializerAPI 设置为 true 才能正常工作。

      根据您的需要,您可以尝试更改为resourceHash._id.$id 或其他任何适合您的方式。如果您不确定,请尝试console.log(resourceHash) 检查数据。

      【讨论】:

        猜你喜欢
        • 2012-07-19
        • 2013-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-15
        相关资源
        最近更新 更多