2011-07-31 48 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。 –