9

我正在使用带有 rails 和 MongoDB 的 ember-data,并且在 _id 字段中存储 ID 的方式存在问题。

Ember-data 将使用 id 作为 ID 的默认字段,因此我尝试像这样覆盖它:

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

这似乎在大多数情况下都有效,但在某些情况下,我会从 ember 中得到例外情况:

未捕获的错误:断言失败:您的服务器返回了带有键 _id 的哈希,但您没有映射

我怀疑这可能是 ember-data 中的一个错误,因为它仍在大量开发中,但我试图找到一种方法来将 _id 映射到 Rails 中服务器端的 id ?我正在使用 mongoid 进行 mongo 映射。

4

9 回答 9

8

如果您使用的是 Mongoid,这里有一个解决方案,因此您不必def id; object._id.to_s; end为每个序列化程序添加方法

添加以下 Rails 初始化程序

Mongoid 3.x

module Moped
  module BSON
    class ObjectId
      alias :to_json :to_s
      alias :as_json :to_s
    end
  end
end

蒙古族 4

module BSON
  class ObjectId
    alias :to_json :to_s
    alias :as_json :to_s
  end
end

活动模型序列化器Building

class BuildingSerializer < ActiveModel::Serializer
  attributes :id, :name
end

生成的 JSON

{
  "buildings": [
    {"id":"5338f70741727450f8000000","name":"City Hall"},    
    {"id":"5338f70741727450f8010000","name":"Firestation"}
  ]
}

这是 brentkirby 建议的猴子补丁,由arthurnn为 Mongoid 4更新

于 2014-04-05T13:04:13.257 回答
3

另一种方法可能是使用(如果可能的话)ActiveModel::Serializer。(我认为它应该接近 rabl (?))

来自 ember-data gihtub:https : //github.com/emberjs/data:
对遵循 active_model_serializers gem 约定的 Rails 应用程序的开箱即用支持

当我们开始使用 ember-data 时,我们正在制作as_json(),但使用 gem 肯定更好:)

于 2012-07-20T06:49:56.930 回答
1

最好的方法是使用ActiveModel::Serializers. 由于我们使用的是Mongoid,因此您需要添加这样的 include 语句(请参阅benedikt的此要点):

# config/initializers/active_model_serializers.rb
Mongoid::Document.send(:include, ActiveModel::SerializerSupport)
Mongoid::Criteria.delegate(:active_model_serializer, :to => :to_a)

然后包括您的序列化程序。像这样的东西:

# app/serializers/user_serializer.rb
class UserSerializer < ActiveModel::Serializer
  attributes :id, :name, :email
  def id
    object._id
  end 
end

这解决了_id问题

于 2013-03-06T19:20:06.927 回答
1

我在使用带有 ember-resource 和 couchdb 的 ember.js 时遇到了类似的问题,它的 ID 也存储为_id.

作为该问题的解决方案,我为所有包含计算属性的模型类定义了一个超类,以_idid这样复制:

// 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()

也许这也可以解决您的问题?

于 2012-07-22T15:25:15.717 回答
1

啊,您可以制作 JSON 以使用 id 方法而不是 _id 属性,而不是在 JSON 中包含 _id。方法:

您可以使用rabl,JSON 可能是这样的:

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

您还可以制作 as_json 方法

class User
  def as_json(args={})
    super args.merge(:only => [:email], :methods => [:id, :full_name])
  end
end
于 2012-07-20T03:31:32.110 回答
1

joscas 回答的第二部分为我解决了 Rails4/Ruby2 的 id 问题,但我必须 .to_s _id。

class UserSerializer < ActiveModel::Serializer
  attributes :id, :name, :email
  def id
    object._id.to_s
  end
end
于 2013-06-16T22:59:37.460 回答
0

如果您使用 Mongoid3,这里的猴子补丁可能适合您。

https://gist.github.com/4700909

于 2013-02-03T08:08:30.907 回答
0

我不知道它是什么时候添加的,但你可以告诉 Ember-Data 主键是 _id:

DS.RESTAdapter.extend({
  serializer: DS.RESTSerializer.extend({
    primaryKey: '_id'
  })
});
于 2014-12-03T04:10:27.477 回答
0

虽然这个问题很老了,但我仍然认为我的回答可以帮助其他人:

如果您使用的是 ActiveModelSerializer,那么您只需要这样做:

class UserSerializer < ActiveModel::Serializer
     attributes :id , :name
end

一切正常。顺便说一句,我在前端使用 emberjs。

于 2015-11-26T12:26:41.453 回答