J'essaye de faire une requête similaire comme ça
def self.search(search, page = 1 )
paginate :per_page => 5, :page => page,
:conditions => ["name LIKE '%?%' OR postal_code like '%?%'", search, search], order => 'name'
end
Mais quand il est exécuté, quelque chose ajoute des guillemets, ce qui provoque la sortie de l'instruction sql comme ceci
SELECT COUNT(*)
FROM "schools"
WHERE (name LIKE '%'havard'%' OR postal_code like '%'havard'%')):
Vous pouvez donc voir mon problème. J'utilise Rails 4 et Postgres 9, tous deux que je n'ai jamais utilisés, donc je ne sais pas si c'est une chose d'activerecord ou éventuellement une chose postgres.
Comment puis-je configurer cela pour avoir comme '%my_search%'
dans la requête finale?
sql
ruby-on-rails
ruby
postgresql
activerecord
Harry Forbess
la source
la source
search
chaînes sont-elles nettoyées??
dans le où s'occupera de la désinfection%
et à l'_
intérieursearch
ne seront pas désinfectées, selon cette approche.Au lieu d'utiliser la
conditions
syntaxe de Rails 2, utilisezwhere
plutôt la méthode de Rails 4 :REMARQUE: ce qui précède utilise la syntaxe des paramètres au lieu de? placeholder: ces deux doivent générer le même sql.
REMARQUE: utilisation
ILIKE
pour le nom - version postgres insensible à la casse de LIKEla source
Movie.where("title ILIKE :s", s: search_string)
il est traduitSELECT 1 AS one FROM "movies" WHERE (title ILIKE 'test') LIMIT $1
par ActiveRecord (Rails 5.1.6) - veuillez noter qu'il n'y a pas de symbole de pourcentage après l'ILIKE)search_string
variable. Je pense que laSELECT 1 AS one
sortie est dans la console de rails uniquement ou que vous utilisezlimit(1)
? FYI: Rails 5.1.6 a des problèmes de sécurité, utilisez plutôt 5.1.6.2 ou 5.1.7Bien que l'interpolation de chaînes fonctionnera, comme votre question spécifie les rails 4, vous pouvez utiliser Arel pour cela et garder votre base de données d'application indépendante.
la source
ActiveRecord est suffisamment intelligent pour savoir que le paramètre auquel se réfère le
?
est une chaîne, et donc il l'entoure de guillemets simples. Vous pouvez, comme le suggère un article, utiliser l'interpolation de chaîne Ruby pour remplir la chaîne avec les%
symboles requis . Cependant, cela peut vous exposer à l'injection SQL (ce qui est mauvais). Je vous suggère d'utiliser laCONCAT()
fonction SQL pour préparer la chaîne comme ceci:"name LIKE CONCAT('%',?,'%') OR postal_code LIKE CONCAT('%',?,'%')", search, search)
la source
%
est ajouté / ajouté ou non). Soit cela fonctionne comme prévu, soit les rails ont un bug majeur affectant les deux cas.Essayer
Voir la documentation sur les conditions AREL pour plus d'informations.
la source
la source