ruby-on-rails - 为什么 Rails 查询在生产中区分大小写而不在开发中区分大小写?

标签 ruby-on-rails ruby postgresql

今天在调试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.fooThomas.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/

相关文章:

ruby-on-rails - 在 API 调用上过滤之前 Rails 跳过

c# - 为什么类结构语言中的构造函数通常被认为是线程安全的?

sql - Postgresql UNION 花费的时间是运行单个查询的 10 倍

ruby-on-rails - 在 rails 中突出显示当前页面,仅适用于某些页面

ruby-on-rails - 索引同时未显示在 structure.sql 中

arrays - 我想使用logstash输入elasticsearch结果创建一个新数组

python - 如何在日期列的 sql 格式查询字符串中设置日期值或空值

postgresql - SQL 中每个 uuid 的固定时间戳范围

ruby-on-rails - 设计路线助手在测试期间不再为人所知

ruby-on-rails - 无法加载此类文件 -- puma/capistrano (LoadError)