2014-02-07 2 views
0

Можно ли распознать, если строка отформатирована как BSON ObjectID?Можно ли определить формат строки?

Для строк мы можем сделать:

"hello".is_a?(String) # => true 

Это не будет работать, так как ObjectID является строка в любом случае. Но можно ли проанализировать строку, чтобы определить, отформатирован ли она как идентификатор объекта BSON?

Обычно идентификаторы объекта имеют этот формат.

52f4e2274d6f6865080c0000 

Критерии форматирование stated in the docs:

ObjectId представляет собой тип BSON 12 байт, построен с использованием:

значения 4 байта, представляющие секунды с началом эпохи Unix,
3-байтовый идентификатор машины,
2-байтовый идентификатор процесса и
3-байтовый счетчик, начиная со случайного значения.

+4

Существуют ли 12-байтовый шестнадцатеричные строки, которые * * не будут действительными идентификаторами объекта BSON? – Gareth

+0

Вы используете мангоид? – ram

+0

@ram да, я использую Mongoid. –

ответ

2

Любой длиной 24 chararcters шестнадцатеричная строка является объект BSON идентификатор, поэтому вы можете проверить это, используя это регулярное выражение:

'52f4e2274d6f6865080c0000' =~ /\A\h{24}\z/ 
# => 0 

И moped (используемый Mongoid) и bson (используется mongo_mapper) драгоценных камней инкапсулирует эту проверку в legal? метода:

require 'moped' 
Moped::BSON::ObjectId.legal?('00' * 12) 
# => true 


require 'bson' 
BSON::ObjectId.legal?('00' * 12) 
# => true 
2

Mongoid использование: .is_a?(Moped::BSON::ObjectId) sytanx.

Пример:

some_id = YourModel.first.id 
some_id.is_a?(Moped::BSON::ObjectId) 

Примечание:

"52d7874679478f45e8000001" .is_a (String) # Печатает истинный

+0

если я попробую это в своей модели, я получу «неинициализированную константу Moped :: BSON» Ошибка. –

+0

Монгоидная версия? Проверьте как список драгоценных камней | grep 'mongoid'. – ram

+0

Я получил его для работы. Но я думаю, что этот метод не будет работать для меня. Причина в том, что я хочу переопределить метод 'find()' в модели. Поэтому 'find (" 52f4e21e4d6f686786000000 ")' всегда будет оцениваться как false, поскольку искатель передает строку. –

Смежные вопросы