Если вы используете PostgreSQL => 9.4 в качестве адаптера БД, может быть, вы могли бы добавить в миграцию это "unaccent" расширение , которое, я думаю, делает то, что вы хотите, вот так :
def self.up
enable_extension "unaccent" # No falla si ya existe
end
Для проверки в консоли:
2.3.1 :045 > ActiveRecord::Base.connection.execute("SELECT unaccent('unaccent', 'àáâãäåÁÄ')").first
=> {"unaccent"=>"aaaaaaAA"}
Обратите внимание, что до сих пор чувствительны к регистру.
Тогда, возможно, используйте его в области видимости, например:
scope :with_canonical_name, -> (name) {
where("unaccent(foos.name) iLIKE unaccent('#{name}')")
}
Оператор iLIKE делает регистр поиска нечувствительным. Существует другой подход, использующий тип данных citext . Здесь - обсуждение этих двух подходов. Также обратите внимание, что не рекомендуется использовать нижнюю () функцию PosgreSQL .
Это сэкономит вам некоторое пространство БД, поскольку вам больше не потребуется поле cannonical_name и, возможно, упростит вашу модель за счет некоторой дополнительной обработки в каждом запросе в размере, зависящем от того, используете ли вы iLIKE или Цитата, и ваш набор данных.
Если вы используете MySQL , возможно, вы можете использовать это простое решение , но я его не проверял.