如何在mongo_mapper + Rails中为每条记录分配单独的密钥

时间:2010-05-21 16:33:24

标签: ruby-on-rails mongodb mongomapper

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

Product.create :foo => 123

然后

Product.create :bar => 456

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

这绝对不是mongodb本身的限制,因为如果我重新启动rails控制台并使用不同的列集创建另一个记录,它将不会添加前2个记录中的列。

因此,似乎mongomapper会记住所有使用的密钥,并将所有插入到所有记录中,即使未提供值也是如此。

问题显然是:如何禁用这种疯狂的属性爆炸?

基本上我只希望我在模型中指定的'永久'键在每个记录中,但是每个记录都要指定所有'额外'属性,而不是弄乱后续记录。

1 个答案:

答案 0 :(得分: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

我没有测试过,但可能出现什么问题?