9

rails と MongoDB で ember-data を使用していますが、MongoDB の _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 を id にマップする方法を見つけようとしていましたか? 私はmongoidを使用してmongoマッピングを行っています。

4

9 に答える 9

8

def id; object._id.to_s; endMongoid を使用している場合は、すべてのシリアライザーにメソッドを追加する必要がないようにするソリューションを次に示します。

次の Rails イニシャライザを追加します

モンゴイド 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を使用することです。(ラブルに近いと思います(?))

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

ああ、JSONに_idを含める代わりに、_id属性ではなくidメソッドを使用するようにJSONを作成することができます。方法:

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

最良の方法はを使用すること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する計算済みプロパティを含むすべてのモデル クラスのスーパークラスを定義しました。id

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

joscas の回答の 2 番目の部分では、Rails4/Ruby2 で id の問題が修正されましたが、_id を .to_s する必要がありました。

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 に primaryKey が _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 に答える