Ruby将activerecord与字符串宽度特殊字符进行比较

时间:2013-12-16 16:29:08

标签: ruby-on-rails activerecord

所以我想通过Person搜索我的name模型。对于这个例子,它可以是“Iñaki”或“Caneça”。如果没有上下案件的顾虑,我怎么能这样做呢?

我尝试过:Person.where("upper(name) = ?", name.upcase)但如果我输入IÑAKI或CANEÇA,那肯定不起作用。

我知道其他一些答案中提到的代码.force_encoding('ISO-8859-1').encode('UTF-8'),但我怎么能在这里应用呢?

2 个答案:

答案 0 :(得分:1)

这是一个复杂的主题,但基于我非常有限的调查:

  • 某些数据库支持UTF-8,默认为UTF-8,并以某种方式支持重音字符的方式实现upper。我认为Postgres属于那个类别
  • Ruby,即使从2.0开始,也不支持String的重写字符,无论是大写还是小写

最棘手的似乎是字符之间的大写/小写关系因语言环境而异(例如,相同的小写字符可能会根据语言环境映射到不同的大写字符)。

无论如何,当我看到对UnicodeUtils gem的引用时,我的机器上的以下内容适用于您提供的简单示例:

Person.where("upper(name) = ?", name.mb_chars.upcase)

Rails将mb_chars方法添加到String

答案 1 :(得分:0)

您的config / database.yaml文件中是encoding: utf8吗?这可以解决问题。