Rails: Можете ли вы перевести этот SQL-запрос из MySQL в SQlite? - PullRequest
0 голосов
/ 05 сентября 2011

Можете ли вы перевести этот код Rails для MySQL:

def Customer.find_by_key(key)
  Customer.find(:all, :conditions => "pre_name REGEXP '.*#{key}.*' 
      OR sur_name REGEXP '.*#{key}.*' 
      OR street REGEXP '.*#{key}.*' 
      OR zip REGEXP '.*#{key}.*' 
      OR city REGEXP '.*#{key}.*' 
      OR phone_1 REGEXP '.*#{key}.*' 
      OR phone_2 REGEXP '.*#{key}.*' 
      OR email REGEXP '.*#{key}.*' 
      OR company REGEXP '.*#{key}.*'")
end

в код SQlite3?

Ответы [ 2 ]

3 голосов
/ 05 сентября 2011

Функция REGEXP не определена по умолчанию в sqlite3, вам придется немного поработать перед этим.

Вставьте это в инициализатор (например, config/initializers/sqlite_regexp.rb), работает с рельсами 3.1 (см. Ниже для рельсов 3.0):

require 'active_record/connection_adapters/sqlite3_adapter'

class ActiveRecord::ConnectionAdapters::SQLite3Adapter
  def initialize(db, logger, config)
    super
    db.create_function('regexp', 2) do |func, pattern, expression|
      regexp = Regexp.new(pattern.to_s, Regexp::IGNORECASE)

      if expression.to_s.match(regexp)
        func.result = 1
      else
        func.result = 0
      end
    end
  end
end

Код украден здесь .

Конечно, вы можете переписать ваш запрос, как в ответе @ mu, но я подумал, что было бы неплохо узнать, как на самом деле реализовать функцию.

Обновление

Приведенный выше код не работает для rails 3.0, это должно работать:

require 'active_record/base'
require 'active_record/connection_adapters/sqlite_adapter'

module ActiveRecord::ConnectionAdapters
  class SQLite3Adapter < SQLiteAdapter
    def initialize(db, logger, config)
      super
      db.create_function('regexp', 2) do |func, pattern, expression|
        regexp = Regexp.new(pattern.to_s, Regexp::IGNORECASE)

        if expression.to_s.match(regexp)
          func.result = 1
        else
          func.result = 0
        end
      end
    end
  end
end
3 голосов
/ 05 сентября 2011

Замените эти:

pre_name REGEXP '.*#{key}.*'

с LIKE:

pre_name LIKE '%#{key}%'

Или лучше, используйте заполнители:

:conditions => [
    "pre_name LIKE :pattern OR sur_name LIKE :pattern ...",
    { :pattern => '%' + key + '%' }
]

SQLite понимает REGEXP, но по умолчанию он не реализован , вы должны реализовать его самостоятельно Вы можете добавить свою реализацию, но нет смысла, когда LIKE, вероятно, сделает эту работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...