Есть ли зарезервированные имена ключей в MongoMapper? - PullRequest
0 голосов
/ 25 июня 2010

Могу ли я, например, объявить модель с ключом с именем :key? Есть ли какое-нибудь слово, которое я не могу использовать для ключа?

Ответы [ 3 ]

3 голосов
/ 04 августа 2010

_id и _type.Кроме того, любая вещь, которая создаст метод, такой же, как метод экземпляра mongomapper doc / edoc, например, ассоциации и т. Д.

2 голосов
/ 26 июля 2010

Первый вопрос, если очень легко ответить самому себе. Откройте 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 и _type. Вы можете использовать либо, но они изменят поведение. Использование _id сделает все, что вы устанавливаете в качестве этого ключа, уникальным идентификатором объекта. Использование _type приведет к тому, что MongoMapper попытается создать экземпляр того, что находится в вашем ключе _test, при возвращении объекта из базы данных.

0 голосов
/ 29 марта 2013

Вот конкретный пример ответа Джона Нанемейкера.

Я обнаружил, что в коде экземпляра вашего объекта есть ссылки на следующие токены, и поэтому они будут конфликтовать с любым ключом с тем же именем (mongo_mapper / plugins / callbacks.b):

:destroy
:save
:create
:update

Если вы определите

key :update, Integer

тогда вы сможете ПОЛУЧИТЬ, УДАЛИТЬ, POST, но не PUT, потому что он попытается вызвать run_callbacks (: update), что на тот момент стало бессмысленным. Я не знаю, как это исправить, чтобы в моей модели было поле «обновление». Кто-нибудь?

Follow-up: кажется, что экземплярный метод, который выполняет фактическое обновление, также называется: update, поэтому он не поможет исключить использование этих токенов для обратных вызовов. Скорее, это просто случай столкновения с методом экземпляра, который вызывает гораздо более странную ошибку, потому что он используется в качестве типа обратного вызова FIRST, прежде чем использоваться в качестве метода.

...