Rails: Можете ли вы перевести этот SQL -запрос с MySQL на SQLite?
-
22-10-2019 - |
Вопрос
Можете ли вы перевести этот код 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?
Решение
А REGEXP
Функция не определена по умолчанию в SQLITE3, вам придется делать немного работы раньше.
Приложить это в инициализатор (например, config/initializers/sqlite_regexp.rb
), работает с Rails 3.1 (см. Ниже для Rails 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
Другие советы
Заменить это:
pre_name REGEXP '.*#{key}.*'
с как:
pre_name LIKE '%#{key}%'
Или лучше, используйте заполнители:
:conditions => [
"pre_name LIKE :pattern OR sur_name LIKE :pattern ...",
{ :pattern => '%' + key + '%' }
]
SQLite Понимает regexp, но он не реализован по умолчанию, вы должны реализовать это самостоятельно. Вы можете добавить свою реализацию, но нет никакого смысла, когда подобно, вероятно, сделает работу.