今天在调试Rails 5.0.1 应用程序时,我发现了以下意想不到的问题。我在数据库中有一个用户,他的电子邮件地址是 Thomas.A.Jones@company.foo
。当我运行时
User.find_by(email: "thomas.a.jones@company.foo")
在生产中,我得到了一个nil
。但是,如果我执行
User.find_by(email: "Thomas.A.Jones@company.foo")
成功找到记录。奇怪的是,当 Rails 应用程序在开发模式下运行时,这不会发生。我可以使用 thomas.a.jones@company.foo
或 Thomas.A.Jones@company.foo
进行查询,它总能找到记录。
是什么导致 Rails 在生产环境中进行区分大小写的搜索?数据库是 Postgres。所有这些都在同一台机器上使用相同的代码进行测试。
2017 年 2 月 10 日更新
不幸的是,在重建我的开发环境后问题就消失了。阅读下面的一些评论后,生产中区分大小写的搜索是 Postgres/Rails 的预期行为。目前还不清楚为什么我的开发环境(在同一台机器上)执行不区分大小写的搜索。如果我发现更多信息,我会更新...
最佳答案
Postgres 默认区分大小写。您可以使用 ILIKE以避免区分大小写。
The key word ILIKE can be used instead of LIKE to make the match case-insensitive according to the active locale. This is not in the SQL standard but is a PostgreSQL extension.
或者将两者都改为小写然后搜索:
User.where("LOWER(email) = ?", email.downcase)
关于ruby-on-rails - 为什么 Rails 查询在生产中区分大小写而不在开发中区分大小写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42126112/