Функция ungcent postgres против транслитерации RoR
В нашем проекте RoR мы используем функцию ungcent postgres, чтобы получить unaccent версию атрибута имени одной из наших моделей. Атрибут name может содержать любые акцентированные символы из разных языков. Затем мы сохраняем его как атрибут unaccent_name. Мне не нравится это решение, потому что мы должны быть уверены, что у нас установлено и доступно расширение postgres UNACCENT (при тестировании, перемещении / очистке базы данных и т. Д.).
В RoR есть метод ActiveSupport::Inflector.transliterate, который должен делать что-то очень похожее.
Я обнаружил, что он в основном переводит акцентированные символы таким же образом, но есть и некоторое отличие:
тот же результат:
SELECT unaccent('ľščťžý') AS unaccent_name;
=> "lsctzy"
ActiveSupport::Inflector.transliterate('ľščťžý')
=> "lsctzy"
другой результат:
SELECT unaccent('ß') AS unaccent_name;
=> "S"
ActiveSupport::Inflector.transliterate('ß')
=> "ss"
Я знаю, что оба эти метода могут принимать словари с пользовательскими заменами букв, но меня интересует только их общее использование / использование по умолчанию.
Является ли основная цель метода транслитерации такой же, как функция postgres unaccent? Можем ли мы использовать его в качестве замены?
0 ответов
Очень старый пост, но я работаю над проблемой, похожей на OP. Мы хотим иметь возможность искать имя и транслитерировать, чтобы давать лучшие результаты. Однако в наших версиях Postgres и rails символ транслитерирует то же самое как ss.
Просто хотел поделиться своими выводами на случай, если они могут быть полезны другим, кто наткнулся на этот пост.
В рельсах 5.2:
irb(main):001:0> ActiveSupport::Inflector.transliterate('ß')
=> "ss"
В postgres 9.6 я получаю:
db-test=# SELECT unaccent('ß') AS unaccent_name;
unaccent_name
---------------
ss
(1 row)