Rails: ¿Puedes traducir esta consulta SQL de MySQL a SQLite?
-
22-10-2019 - |
Pregunta
¿Puedes traducir este código de rieles para 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
al código SQLITE3?
Solución
los REGEXP
La función no se define de forma predeterminada en SQLITE3, tendrá que hacer un poco de trabajo antes.
Pegue esto en un inicializador (por ejemplo config/initializers/sqlite_regexp.rb
), funciona con Rails 3.1 (ver más abajo para los rieles 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
Robado el código aquí.
Por supuesto, podría reescribir su consulta como en la respuesta de @MU, pero pensé que sería bueno saber cómo implementar realmente la función.
Actualizar
El código anterior no funciona para Rails 3.0, esto debería funcionar:
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
Otros consejos
Reemplace estos:
pre_name REGEXP '.*#{key}.*'
con como:
pre_name LIKE '%#{key}%'
O mejor, use marcadores de posición:
:conditions => [
"pre_name LIKE :pattern OR sur_name LIKE :pattern ...",
{ :pattern => '%' + key + '%' }
]
Sqlite Comprende regexp pero no se implementa de forma predeterminada, tienes que implementarlo tú mismo. Puede agregar su implementación, pero no tiene sentido cuando probablemente haga el trabajo.