Как я могу запросить символы Unicode в Mongodb, используя Ruby? - PullRequest
1 голос
/ 29 февраля 2012

Допустим, у меня есть запись в моей базе данных, которая имеет:

name: "World\u0092s Greatest Jet Fighter Pilot" 

ОК, мне нужно войти и вычистить \u0092 (в БД их было тонна). Я могу запросить так:

# encoding: UTF-8
...
def self.by_partial name 
  return Movie.find(:all, :conditions => {:name => /^.*#{name}.*/i})
end


# console: 
>> sel = Movie.by_partial(/Greatest/) and sel.size
=> 1

и верните правильное количество записей. Но когда я добавляю Unicode, он терпит неудачу:

>> sel = Movie.by_partial(/\u0092/) and sel.size
=> 0
>> sel = Movie.by_partial(/\\u0092/) and sel.size
=> 0
>> sel = Movie.by_partial('\u0092') and sel.size
=> 0
>> sel = Movie.by_partial('\\u0092') and sel.size
=> 0

Что мне нужно сделать, чтобы иметь возможность запрашивать записи, содержащие символы Юникода? Это настройка в консоли рельсов? Мне удалось решить эту проблему путем итерации записей и проверки примерно так if mov.name =~ /\u0092/ ..., но я не могу понять, как передать строку Unicode в мой селектор mongoid. Повторение записей казалось слишком грубой силой. К счастью, мне не нужно делать это очень часто.

1 Ответ

2 голосов
/ 29 февраля 2012

Я не думаю, что ваша проблема с Unicode, ваши проблемы:

  1. Строка интерполяции внутри by_partial.
  2. И \u работает только внутри строк в двойных кавычках.

Вторые вещи первыми:

> '\u0070'
=> "\\u0070" 

> '\\u0070'
=> "\\u0070" 

> "\u0070"
=> "p" 

Так что Movie.by_partial("\u0092") должно работать.

Ваша первая проблема заключается в том, что вы передаете /\u0092/ (что соответствует соответствующему символу) на by_partial, но by_partial делает это:

/^.*#{name}.*/i

И /^.*#{/\u0092/}.*/i и это заканчивается как /^.*(?-mix:\u0092).*/i. Я предполагаю, что у драйвера MongoDB есть некоторые проблемы с преобразованием этого регулярного выражения Ruby в регулярное выражение JavaScript.

Драйвер MongoDB, похоже, совсем не похож на \u в регулярном выражении. Подача /^\u0070/ в MongoDB не дает мне совпадений, но /^p/ находит то, что я ожидаю, /^#{"\u0070"}/ также работает. Я не уверен, что происходит в смелости переводчика регулярных выражений MongoDB, но мы не единственные, кто сталкивался с этим . Я предполагаю, что переводчик регулярных выражений MongoDB не понимает \u, поэтому он в итоге преобразуется в необработанный \\u0092, и, поскольку в вашей базе данных нет последовательности из шести символов, вы ничего не найдете .

...