2

mongodbにレコードを追加するときは、必要なキーを指定でき、データベースに保存されます。問題は、次に別のレコードを挿入するときに、それらのキーが記憶されることです。たとえば、次のようにすると、次のようになります。

Product.create :foo => 123

その後

Product.create :bar => 456

:foo => nil2枚目のレコードでフィールドを取得します。

これは間違いなくmongodb自体の制限ではありません。これは、railsコンソールを再起動して、異なる列のセットでさらに別のレコードを作成すると、最初の2つのレコードの列が追加されないためです。

したがって、mongomapperは使用されたすべてのキーを記憶し、値が指定されていない場合でも、それらすべてすべてのレコードに挿入するようです。

問題は明らかにです:このクレイジーな属性の爆発を無効にするにはどうすればよいですか?

基本的に、モデルで指定する「永続的な」キーのみをすべてのレコードに含める必要がありますが、すべての「余分な」属性はレコードごとに指定し、結果のレコードを混乱させないようにします。

4

1 に答える 1

1

キーに書き込むとき、MongoMapperは、キーがドキュメントで定義されていることを確認します(keyクラスメソッドを使用して自分で宣言したかのように)。ここでそのコードを参照してください:

http://github.com/jnunemaker/mongomapper/blob/master/lib/mongo_mapper/plugins/keys.rb#L237

MongoMapperには、クラスで宣言したキーと動的に作成するキーを区別する方法はないと思います。

そうは言っても、いつでも独自の「reset_keys」を作成できます。クラス内の@keys変数を破棄し、再構築するメソッド。カプセル化を破っているので、これは一種の粗雑で壊れやすいものです。これがどのように見えるかです!

class Product
  include MongoMapper::Document

  def self.reset_keys!
    @keys = nil
    key :_id, ObjectId
    key :permanent_biz
    key :permanent_buz
  end

  reset_keys!
end

Product.create :foo => 123
Product.reset_keys!
Product.create :bar => 456

私はこれをテストしませんでしたが、何がうまくいかない可能性がありますか?

于 2010-07-16T14:10:10.627 に答える