例如,我可以用一个名为 的键声明一个模型:key
吗?有什么词不能用作键吗?
3 回答
_id 和 _type。此外,任何会创建与 mongomapper doc/edoc 实例方法相同的方法的东西,例如关联等。
第一个问题如果很容易回答你自己。打开 irb 并尝试:
>> require 'mongo_mapper'
=> true
>> MongoMapper.database = 'test'
=> "test"
>> class Test
>> include MongoMapper::Document
>> key :key
>> end
=> #<MongoMapper::Plugins::Keys::Key:0x101fc7a90 @default_value=nil, @type=nil, @name="key", @options={}>
>> t = Test.new(:key => 'value')
=> #<Test _id: BSON::ObjectID('4c4dcced7123374587000001'), key: "value">
>> t.save
=> true
>> Test.all
=> [#<Test _id: BSON::ObjectID('4c4dcced7123374587000001'), key: "value">]
没有错误?我猜key
是一个有效的密钥!
据我所知,您不应该为自己的数据使用的唯一键是_id
and _type
。您可以使用其中任何一种,但它们会改变行为。使用_id
将使您设置为该键的任何内容都成为对象的唯一 ID。当从数据库中取回对象时,使用_type
将导致 MongoMapper 尝试实例化密钥中任何内容的实例。_test
这是John Nunemaker回答的一个具体例子。
我发现在您的对象的实例代码中引用以下标记的困难方式,因此将与任何同名的键(mongo_mapper/plugins/callbacks.b)发生冲突:
:destroy
:save
:create
:update
如果你定义
key :update, Integer
那么您将能够 GET、DELETE、POST,但不能 PUT,因为这将尝试调用 run_callbacks(:update),这在那时已成为无稽之谈。我不知道如何解决这个问题,所以我可以在我的模型中有一个名为“更新”的字段。任何人?
后续:执行实际更新的实例方法似乎也称为:update,因此消除使用这些令牌进行回调无济于事。相反,这只是与实例方法发生冲突的情况,这会导致更奇怪的错误,因为它在用作方法之前首先用作回调类型。