2

当我在 mongodb 中添加记录时,我可以指定我想要的任何键,并将其存储在数据库中。问题是它会在我下次插入另一条记录时记住这些键。例如,如果我执行以下操作:

Product.create :foo => 123

接着

Product.create :bar => 456

:foo => nil在第二条记录中获得了字段。

这绝对不是 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 回答