2017-02-09 60 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