我们在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,而不仅仅是作为适配器的配置。
答案 0 :(得分:4)
通过编写我自己的数据对象适配器来覆盖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
但最终我决定将相关应用程序移植到使用文档数据库。