2011-07-31 75 views
11

我的開發數據庫是SQLite,但是我將應用程序部署到Heroku,他們使用的是PostgreSQL。使用Rails進行Postgres不區分大小寫的搜索

現在,如果我執行搜索,有時會出現兩個不同的結果,因爲PostgreSQL區分大小寫,但SQLite不區分大小寫。

不應該Rails標準化這些東西?我應該用什麼方法來解決這個問題?

Here is how to fix it with raw SQL

+1

如果你正在部署到Heroku,我建議在PostgreSQL之上開發。沒有ORM會保護你免受特定於數據庫的行爲。 –

+1

而且我喜歡在本地運行SQLite和運送Postgre,所以我沒有綁定到某個數據庫。給他自己。 –

回答

41

不區分大小寫的搜索在Postgres的:

  • 使用ilike代替like(不區分大小寫等)
  • ,如果你想使用=,使雙方無論是上或下
+4

謝謝! 'like'的問題是我不知道如何用'OR'運算符鏈接它們。是否保存與軌道上的每個支持的數據庫一起使用? ''LOWER(title)LIKE LOWER('%#{search_term}%')「' – antpaw

+1

它不會在mysql,sqlite和pgsql中制動我的代碼,所以它足夠好,謝謝! – antpaw

+0

如果你想在MYSQL和POSTGRES上運行相同的代碼,使用UPPER或LOWER(雖然這顯然不是最佳實踐!) –

4

DDL處理方法是citext數據類型或不區分大小寫的TEXT。

4

ActiveRecord無法處理很多相對常見的事情,而LIKE匹配就是其中之一。這裏是如何使用直線Arel來實現這一點。

Model.where(
    Model.arel_table[:title].matches("%#{search_term}%") 
) 

您可以安裝Arel-Helpers使這一點更容易

Model.where(Model[:title].matches("%#{search_term}%")) 

我以前推薦Squeel這一點,但原創者已經停止支持它,似乎沒有成爲一個全實時開發者維護它。而且由於它使用私有的ActiveRecord API,它需要不斷的管理。

+0

偉大的解決方案,Squeel很棒,但只是提醒說這是Postgres特定的行爲。如果您希望爲其他RDBMS執行此操作,則輸出可能區分大小寫。 – kgx

+0

@kgx實際上這個例子在兩種情況下都能按預期工作。正如@antpaw上面所說的,默認情況下,SQLite'LIKE'不區分大小寫。所以這將在SQLite中使用LIKE,在PostgreSQL中使用ILIKE。 –