【问题标题】:How to do a case-insensitive search for non-English characters in Rails?如何在 Rails 中对非英文字符进行不区分大小写的搜索?
【发布时间】:2016-09-05 17:54:28
【问题描述】:

现在我使用这段代码来查找项目:

where("lower(name) like ?", "%#{search_word.downcase}%")

但它不适用于俄语字符。

所以我尝试了这个:

where("lower(name) like ?", "%#{search_word.mb_chars.downcase.to_s}%")

但它也没有工作。

我该怎么办?

更新:好的。如果我写 ilike 而不是 like 它似乎适用于 Postgres。我如何使它也可以与 sqlLite 一起使用? =)

【问题讨论】:

  • 我想知道 JRuby 是否能更好地处理它?它可能使用 Java 功能,并且 Java 有一些出色的国际化。
  • @KeithBennett 太酷了。我将不得不安装 jruby 和 jdk 仅仅因为 1 行代码?=)
  • 我意识到这对你来说可能还不够重要,但如果你确实有 JRuby,看看它是否能更好地工作会很有趣。我使用 rvm,并安装了 JRuby——如果你有一个可以测试它的脚本(包括 SQLite 设置),我很乐意运行它并报告结果。
  • 想一想,因为它只是对downcase的测试,它甚至不需要任何SQLite代码。当downcase 被同时调用时,你可以给我两个字符串。
  • @user2950593 谢谢!我对其进行了测试,发现 JRuby 的小写字母也无法正确转换字符串,但从 JRuby 调用的 Java 确实 正确处理了它(参见 gist.github.com/keithrbennett/48295f6fd9ddcdf12a165218e7d900ad)。但这并不是说对我们有帮助。 ;)

标签: ruby-on-rails ruby postgresql sqlite internationalization


【解决方案1】:

感谢@sawa 在Easy way to convert numbers into ordinals in words 问题上,我刚刚发现了惊人的twitter_cldr gem。看看这个:

2.3.0 :001 > require 'twitter_cldr'
 => true
2.3.0 :002 > 'Привет'.localize.casefold.to_s
 => "привет"
2.3.0 :005 > 'Привет'.localize.casefold.to_s == 'привет'.localize.casefold.to_s
 => true

所以只需使用这个 gem 来获取小写字符串与数据库值进行比较。

【讨论】:

    猜你喜欢
    • 2010-10-12
    • 2014-04-16
    • 1970-01-01
    • 2013-02-24
    • 2011-10-17
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多