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

时间:2017-02-09 00:22:36

标签: 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的预期行为。至于为什么我的开发环境(在同一台机器上)执行不区分大小写的搜索仍然不清楚。如果我发现更多信息,我会更新...

2 个答案:

答案 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