我的开发数据库是SQLite,但是我将应用程序部署到Heroku,他们使用的是PostgreSQL。使用Rails进行Postgres不区分大小写的搜索
现在,如果我执行搜索,有时会出现两个不同的结果,因为PostgreSQL区分大小写,但SQLite不区分大小写。
不应该Rails标准化这些东西?我应该用什么方法来解决这个问题?
Here is how to fix it with raw SQL
我的开发数据库是SQLite,但是我将应用程序部署到Heroku,他们使用的是PostgreSQL。使用Rails进行Postgres不区分大小写的搜索
现在,如果我执行搜索,有时会出现两个不同的结果,因为PostgreSQL区分大小写,但SQLite不区分大小写。
不应该Rails标准化这些东西?我应该用什么方法来解决这个问题?
Here is how to fix it with raw SQL
另DDL
处理方法是citext
数据类型或不区分大小写的TEXT。
ActiveRecord无法处理很多相对常见的事情,而LIKE匹配就是其中之一。这里是如何使用直线Arel来实现这一点。
Model.where(
Model.arel_table[:title].matches("%#{search_term}%")
)
您可以安装Arel-Helpers使这一点更容易
Model.where(Model[:title].matches("%#{search_term}%"))
我以前推荐Squeel这一点,但原创者已经停止支持它,似乎没有成为一个全实时开发者维护它。而且由于它使用私有的ActiveRecord API,它需要不断的管理。
伟大的解决方案,Squeel很棒,但只是提醒说这是Postgres特定的行为。如果您希望为其他RDBMS执行此操作,则输出可能区分大小写。 – kgx
@kgx实际上这个例子在两种情况下都能按预期工作。正如@antpaw上面所说的,默认情况下,SQLite'LIKE'不区分大小写。所以这将在SQLite中使用LIKE,在PostgreSQL中使用ILIKE。 –
如果你正在部署到Heroku,我建议在PostgreSQL之上开发。没有ORM会保护你免受特定于数据库的行为。 –
而且我喜欢在本地运行SQLite和运送Postgre,所以我没有绑定到某个数据库。给他自己。 –