2010-01-18 8 views
1

J'ai quelques conditions à transmettre à un chercheur. Le problème est que je ne veux pas passer d'une manière sécuritaire. Alors, imaginez que je reçois un hachage:Enregistrement actif recherche des conditions sous forme de chaîne

hash = {:start_date=>'2009-11-01',:end_date=>'2010-01-23'} 

je voudrais transmettre à mon finder comme:

Model.find(:all,:conditions=>"created > '#{start_date}' and created < '#{end_date}'") 

Le problème est qu'il est dangereux et je suis exposé à des problèmes d'injection SQL. Ma question est, comment serait la meilleure façon de composer cette condition?

Je veux le faire dynamiquement. Par exemple, je fais aujourd'hui comme:

find_condition = ['created > ? and created < ?','2009-10-01','2010-01-01'] 
Model.find(:all,:conditions=>find_condition) 

Répondre

4

Vous pouvez l'écrire comme ceci:

Model.find(:all,:conditions=>["created > :start_date and created < :end_date", {:start_date => params[:one], :end_date => params[:two]}]) 

Il sera échappé correctement.

1

Active Record soutient échapper à des conditions en utilisant un point d'interrogation:

Model.all(:conditions => ['created > ? and created < ?', 
      :start_date, :end_date]) 

Certains de plus amples informations dans les guides de rails que vous pourriez être intéressé par:

+0

@JohnTopley Je pense que cela devrait être réellement ' Model.all (: conditions => ['created>? et créé jerhinesmith

+0

@jerhinesmith Merci, bonne prise! Je vais mettre à jour l'exemple. –

+0

Je crois que vous vouliez dire start_date, end_date au lieu de: start_date,: end_date (colons sortis) – kikito

Questions connexes