Rails: Pouvez-vous traduire cette requête SQL de MySQL à SQLite?
-
22-10-2019 - |
Question
Pouvez-vous traduire ce code Rails pour 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
au code Sqlite3?
La solution
La fonction REGEXP
n'est pas définie par défaut dans sqlite3, vous devrez faire un peu de travail avant.
Collez ceci dans un initialiseur (par exemple config/initializers/sqlite_regexp.rb
), fonctionne avec des rails 3.1 (voir ci-dessous pour 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
Vous pouvez bien réécrire votre requête cours comme dans @ la réponse de mu, mais je me suis dit que ce serait bien de savoir comment mettre réellement en œuvre la fonction.
Mise à jour
Le code ci-dessus pas de travail pour les rails 3.0, cela devrait fonctionner:
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
Autres conseils
Remplacer ces:
pre_name REGEXP '.*#{key}.*'
avec LIKE:
pre_name LIKE '%#{key}%'
Ou mieux, utiliser des espaces réservés:
:conditions => [
"pre_name LIKE :pattern OR sur_name LIKE :pattern ...",
{ :pattern => '%' + key + '%' }
]
comprend REGEXP mais il n'est pas mis en œuvre par défaut , vous devez le mettre en œuvre toi même. Vous pouvez ajouter votre implémentation, mais il n'y a aucun moment où LIKE probablement faire le travail.