2017-02-09 61 views
0

今天我调试Rails 5.0.1应用时,发现了以下意外问题。数据库中有一位用户,他的电子邮件地址为[email protected]。当我在生产环境中运行为什么Rails查询区分大小写而不是开发?

User.find_by(email: "[email protected]") 

,我得到一个nil回来。但是,如果我执行

User.find_by(email: "[email protected]") 

它成功找到记录。奇怪的是,当Rails应用程序在开发模式下运行时,这是不会发生的。我可以用[email protected][email protected]查询,它总是找到记录。

什么可能导致Rails在生产中进行区分大小写的搜索?数据库是Postgres。所有这些都在同一台机器上用相同的代码进行测试。

更新2017年2月10日

不幸的是,这个问题重建我的发展环境后就走了。在阅读了下面的一些评论之后,生产中区分大小写的搜索是Postgres/Rails的预期行为。目前还不清楚为什么我的开发环境(在同一台机器上)执行不区分大小写的搜索。我会更新,如果我发现任何更多的信息.​​..

+1

什么是你的后端数据库?即使正在运行完全相同的查询,或者由于服务器默认值导致模式不同,版本也可能有所不同。例如,[用MySQL取决于整理](https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html)。将开发表模式与您的生产模式进行比较并查找差异。 – tadman

+0

在这种特殊情况下,一切都应该是一样的。这是同一台计算机,相同的后端数据库(Postgres)。我通过运行所有迁移来以开发模式重新生成整个数据库。然后我通过重新运行所有迁移来重新创建生产数据库。但是,点了。我会看看我能否在两者之间的决赛桌/模式中发现差异。 – CodeSmith

+1

我只是在这里提出建议,不能得出结论。这很可能是一个微妙的整理问题。您是否尝试过工作数据库的'pg_restore'以查看更改了哪些内容? – tadman

回答

6

Postgres的情况下是默认敏感。您可以使用ILIKE来避免区分大小写。

的关键词ILIKE可以用于替换LIKE,使根据所述活性区域设置的匹配不区分大小写的。这不是SQL标准,而是PostgreSQL扩展。

或者改变都为小写然后搜索:

User.where("LOWER(email) = ?", email.downcase) 
+0

感谢您的信息。我希望避免使用ILIKE或LOWER。希望我可以找出为什么这两个环境行为不同......这让我感到害怕。 – CodeSmith

1

我不知道,为什么到它。但有一个简单的解决方案。

放入模型中。

例:user.rb

class User < ActiveRecord::Base 
    before_save { self.email = email.downcase } 
end