我有一个使用Postgres的Rails应用程序。我的Document
模型具有name
属性。某些名称包含重音字符。几个示例名称:
CondiçõesParaAplicaçãoDaLei
考虑到Introdutórias
我正在查询具有特定名称的模型:
document = Document.where(name: "Example Document Name").first
只要名称不包含特殊字符,这样就可以了,但是只要我使用包含任何重音字符的名称,查询就会返回nil。
$ Document.all
$ #<Document id: 1, name: "Foo" ... >
$ #<Document id: 1, name: "Considerações Introdutórias" ... >
$ Document.where(name: "Foo").first
$ #<Document id: 1, name: "Foo" ... >
$ Document.where(name: "Considerações Introdutórias").first
$ # nil
当名称包含特殊字符时,为什么此查询失败?
在我的config/application.rb
:
config.encoding = "utf-8"
在我的`config / database.yml'中:
encoding: utf8
答案 0 :(得分:1)
检查你的配置。
config.encoding = "utf-8"
在database.yml中查看encoding: utf8
。
查看这些问题
答案 1 :(得分:1)
原来问题不在于Rails,而在于OSX。有不同的方式来表示相同的字符;要么作为单个符号,要么分解为多个组件。两个版本在终端中显示相同,但将名称复制到纯文本文件中,您将看到差异:
组成:
Considerações Introdutórias
分解(我只能通过在分解的字符周围添加空格来获取要在此处显示的分解版本):
Condic ̧ o ̃ es Para Aplicac ̧ a ̃ o Da Lei
为了解决不匹配问题,我使用Unicode Utils编写文件名,然后再将它们添加到数据库中,然后再使用它们进行搜索:
require "unicode_utils/nfc"
...
filename = UnicodeUtils.nfc(filename)