2010-05-07 18 views
16

Je suis nouveau à la fois Ruby et ActiveRecord. J'ai actuellement un besoin de modifier et de morceau de code existant pour ajouter une plage de dates dans le select. La pièce actuelle se présente comme suit:Comment effectuer une recherche dans une plage de dates à l'aide du modèle ActiveRecord?

ReportsThirdparty.find(:all, :conditions => {:site_id=>site_id, :campaign_id=>campaign_id, :size_id=>size_id}) 

Maintenant, je dois ajouter une plage, mais je ne suis pas sûr de savoir comment faire les BETWEEN ou >= ou <= opérateurs. Je suppose que ce que je dois quelque chose de similaire à:

ReportsThirdparty.find(:all, :conditions => {:site_id=>site_id, :campaign_id=>campaign_id, :size_id=>size_id, :row_date=>"BETWEEN #{start_date} AND #{end_date}") 

Même si cela ne fonctionne, je sais que par interpolation ici me laisser l'objet d'attaques par injection SQL.

Répondre

37

Je crois que vous pouvez passer un objet Range à la découverte de ActiveRecord et obtenir ce que vous voulez:

ReportsThirdParty.find(:all, 
    :conditions => { 
    :site_id => site_id, 
    :campaign_id => campaign_id, 
    :size_id => size_id, 
    :row_date => start_date..end_date }) 

Edit: Si vous utilisez Rails 3, vous pouvez vous attendre à utiliser quelque chose de similaire à:

ReportsThirdParty.where( 
    :site_id => site_id, 
    :campaign_id => campaign_id, 
    :size_id => size_id, 
    :row_date => start_date..end_date) 

Pour plus d'informations sur Rails 3 requêtes active record Départ:
http://railscasts.com/episodes/202-active-record-queries-in-rails-3

+0

Absolument parfait! Merci! –