Нечувствителен к регистру, как (или) в Datamapper с Postgresql - PullRequest
7 голосов
/ 05 октября 2011

Мы используем Datamapper в приложении Sinatra и хотели бы использовать регистр без учета регистра, который работает как на Sqlite (локально в разработке), так и на Postgresql (на Heroku в производстве).

У нас есть такие выражения, как

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

Если term - это «BERL», мы получаем предложение «BERLIN» из бэкэндов Sqlite и Postgresql.Однако, если term - это «Berl», мы получаем этот результат только из Sqlite, а не из Postgresql.

Я думаю, это связано с тем, что и dm-postgres-adapter, и dm-sqlite-adapter выводятLIKE в результирующем запросе SQL.Поскольку в Postgresql учитывается регистр LIKE, мы получаем это (для нас нежелательное) поведение.

Есть ли способ получить без учета регистра, как в Datamapper, не прибегая к использованию необработанного SQL-запроса к адаптеру или исправляя адаптер для использования ILIKE вместо LIKE?

Iконечно, можно использовать что-то промежуточное, например:

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

, но тогда мы будем привязаны к использованию Postgresql в нашем собственном коде, а не просто как конфигурация для адаптера.

Ответы [ 2 ]

4 голосов
/ 09 ноября 2011

Написав свой собственный адаптер объекта данных, который переопределяет метод 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

Однако в конце концов я решил портировать рассматриваемое приложение для использования базы данных документов.

2 голосов
/ 10 марта 2013

Для других людей, которые используют datamapper, которым нужна поддержка iilike, а также «похожих на» в PostgreSQL: https://gist.github.com/Speljohan/5124955

Просто добавьте это в свой проект, а затем используйте его, см. Следующие примеры:

Model.all(:column.ilike => '%foo%')
Model.all(:column.similar => '(%foo%)|(%bar%)')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...