当我在mongodb中添加记录时,我可以指定我想要的任何键,它会将它存储在db中。问题是它会在下次插入另一条记录时记住这些键。例如,如果我执行以下操作:
Product.create :foo => 123
然后
Product.create :bar => 456
我在第二条记录中获得:foo => nil
字段。
这绝对不是mongodb本身的限制,因为如果我重新启动rails控制台并使用不同的列集创建另一个记录,它将不会添加前2个记录中的列。
因此,似乎mongomapper会记住所有使用的密钥,并将所有插入到所有记录中,即使未提供值也是如此。
问题显然是:如何禁用这种疯狂的属性爆炸?
基本上我只希望我在模型中指定的'永久'键在每个记录中,但是每个记录都要指定所有'额外'属性,而不是弄乱后续记录。
答案 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
我没有测试过,但可能出现什么问题?