dans des rails 3.0.0, la requête suivante fonctionne très bien:Rails 3 requête soulève exception lorsque COMME utilisant un double deux points et un point
Author.where("name LIKE :input",{:input => "#{params[:q]}%"}).includes(:books).order('created_at')
Cependant, quand je l'entrée en tant que chaîne de recherche (donc contenant un double deux points suivi d'un point):
aa: .bb
Je reçois l'exception suivante:
ActiveRecord :: StatementInvalid: SQLite3 :: SQLException: nom de la colonne ambiguë: created_at
Dans les journaux la ce sont les requêtes SQL:
with aa as input:
Author Load (0.4ms) SELECT "authors".* FROM "authors" WHERE (name LIKE 'aa%') ORDER BY created_at
Book Load (2.5ms) SELECT "books".* FROM "books" WHERE ("books".author_id IN (1,2,3)) ORDER BY id
with aa:.bb as input:
SELECT DISTINCT "authors".id FROM "authors" LEFT OUTER JOIN "books" ON "books"."author_id" = "authors"."id" WHERE (name LIKE 'aa:.bb%') ORDER BY created_at DESC LIMIT 12 OFFSET 0
SQLite3::SQLException: ambiguous column name: created_at
Il semble que le aa: .bb En entrée, une requête supplémentaire est effectuée pour récupérer les id_s de l'auteur distinct. Je pensais que Rails échapperait à tous les caractères. Est-ce un comportement attendu ou un bug?
Cordialement,
Pieter
J'ai oublié de mentionner que la colonne 'created_at' provoque l'exception ambiguë. Je comprends votre point, et c'est une bonne astuce, mais c'est vraiment étrange que cela se produit uniquement lorsque j'introduis un mot: .otherword comme la requête de recherche – Pieter
right, j'ai raté ça: l'ambiguïté est dans la clause ORDER. Vous devriez regarder votre journal pour voir la requête SQL générée pour être sûr que rien de drôle ne se passe. –
Andrew, j'ai ajouté la sortie du journal. Il semble qu'avec l'entrée aa: .bb, une requête supplémentaire soit faite pour déterminer les author_ids distincts, pour aller chercher les livres. Et cette requête soulève l'exception. Ce n'est pas un problème à commander sur 'houses.created_at' au lieu de simplement 'created_at', mais ça m'inquiète que ça ressemble à:. pourrait conduire à une attaque sql? – Pieter