2011-10-05 15 views
7

Estamos utilizando Datamapper en una aplicación Sinatra y nos gustaría utilizar mayúsculas y minúsculas como las que funcionan en Sqlite (localmente en desarrollo) y Postgresql (en Heroku en producción).Insensible a mayúsculas/minúsculas (ilike) en Datamapper con Postgresql

Tenemos declaraciones como

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

Si term es "BERL" obtenemos la sugerencia de "Berlín" tanto desde el backend SQLite y PostgreSQL. Sin embargo, si term es "Berl", solo obtendremos ese resultado de Sqlite y no de Postgresql.

Supongo que esto tiene que ver con el hecho de que tanto dm-postgres-adapter como dm-sqlite-adapter dan como resultado LIKE en la consulta SQL resultante. Dado que Postgresql tiene un caso sensible LIKE obtenemos este comportamiento (para nosotros no deseados).

¿Hay alguna manera de obtener mayúsculas y minúsculas como en Datamapper sin recurrir al uso de una consulta SQL sin formato al adaptador o parcheando el adaptador para usar ILIKE en lugar de LIKE?

que podría utilizar, por supuesto, algo intermedio, como por ejemplo:

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

pero entonces estaría ligado al uso de PostgreSQL dentro de nuestro propio código y no sólo como una configuración para el adaptador.

+0

Se me ocurrió una solución al escribir mi propio adaptador dm-postgres que anula el método 'like_operator'. Al ser un n00b en Stackoverflow, no puedo responder mis propias preguntas durante 8 horas. – moonhouse

Respuesta

4

Al escribir mi propio adaptador de objeto de datos que anula el método like_operator Logré que el 0-sea insensible a las mayúsculas o minúsculas de Postgres.

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 

Eventualmente, sin embargo, decidí portar la aplicación en cuestión para usar una base de datos de documentos.

2

Para otras personas que resultan de utilizar DataMapper apoyo con ganas de iLike, así como 'similar a' en PostgreSQL: https://gist.github.com/Speljohan/5124955

apenas caer que, en su proyecto, y luego usarlo, ver estos ejemplos:

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