使用Postgresql在Datamapper中像(ilike)一样不区分大小写

我们在Sinatra应用程序中使用Datamapper,并希望使用不区分大小写,就像在Sqlite(本地开发)和Postgresql(在生产中的Heroku上)一样。

我们有这样的陈述

TreeItem.all(:name.like =>"%#{term}%",:unique => true,:limit => 20) 

如果term是“BERL”,我们会从Sqlite和Postgresql后端获得建议“BERLIN”。 但是,如果term是“Berl”,我们只从Sqlite而不是Postgresql获得结果。

我想这与dm-postgres-adapter和dm-sqlite-adapter在生成的SQL查询中输出LIKE这一事实有关。 由于Postgresql具有区分大小写的LIKE我们得到了这个(对于我们不需要的)行为。

有没有办法像Datamapper一样不区分大小写而不诉诸于对适配器使用原始SQL查询或修补适配器以使用ILIKE而不是LIKE

我当然可以在两者之间使用某些东西,例如:

 TreeItem.all(:conditions => ["name LIKE ?","%#{term}%"],:unique => true,:limit => 20) 

但是我们将在我们自己的代码中使用Postgresql,而不仅仅是作为适配器的配置。

通过编写我自己的数据对象适配器来覆盖like_operator方法,我设法得到Postgres的不区分大小写的ILIKE

 require 'do_postgres' require 'dm-do-adapter' module DataMapper module Adapters class PostgresAdapter < DataObjectsAdapter module SQL #:nodoc: private # @api private def supports_returning? true end def like_operator(operand) 'ILIKE' end end include SQL end const_added(:PostgresAdapter) end end 

然而,最终我决定将有问题的应用程序移植到使用文档数据库。

对于碰巧使用datamapper的其他人想要支持ilike以及PostgreSQL中的“类似”: https : //gist.github.com/Speljohan/5124955

只需将其删除到项目中,然后使用它,请参阅以下示例:

 Model.all(:column.ilike => '%foo%') Model.all(:column.similar => '(%foo%)|(%bar%)')