在我今天调试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的预期行为。至于为什么我的开发环境(在同一台机器上)执行不区分大小写的搜索仍然不清楚。如果我发现更多信息,我会更新...
答案 0 :(得分:6)
默认情况下,Postgres区分大小写。您可以使用ILIKE来避免区分大小写。
可以使用关键字ILIKE而不是LIKE来根据活动区域设置使匹配不区分大小写。这不是SQL标准,而是PostgreSQL扩展。
或者将两者都改为小写然后搜索:
User.where("LOWER(email) = ?", email.downcase)
答案 1 :(得分:1)
我不确定,为什么呢。但是有简单的解决方案。
将模型放入其中。
Ex:user.rb
class User < ActiveRecord::Base
before_save { self.email = email.downcase }
end