2010-10-29 4 views
1

Besoin d'aide pour refactoriser ce bloc if/else qui construit les conditions d'une requête de recherche.Refactor: Plusieurs params dans find query

if params[:status] && params[:carrier] 
    conditions = ["actual_delivery IS NOT NULL AND actual_delivery > scheduled_delivery AND status_id = ? AND carrier_id = ?", status.id, carrier.id] 
elsif params[:status] 
    conditions = ["actual_delivery IS NOT NULL AND actual_delivery > scheduled_delivery AND status_id = ?", status.id] 
elsif params[:carrier] 
    conditions = ["actual_delivery IS NOT NULL AND actual_delivery > scheduled_delivery AND carrier_id = ?", carrier.id] 
else 
    conditions = ["actual_delivery IS NOT NULL AND actual_delivery > scheduled_delivery"] 
end 

@packages = Package.find(:all, :conditions => conditions) 
+0

Salut Josh, petit monde! Quelle version de Rails utilisez-vous? – wuputah

+0

Petit en effet! 2.3.5 sur ce projet. – Shpigford

Répondre

0

Vous pouvez faire:

conditions = "actual_delivery IS NOT NULL AND actual_delivery > scheduled_delivery" 
conditions += " AND status_id = #{status.id}" if params[:status] 
conditions += " AND carrier_id = #{carrier.id}" if params[:carrier] 

@packages = Package.all(:conditions => [conditions]) 
+0

performances sage << mieux que + =. –

1

Je recommande la création d'un champ dans votre modèle, de prendre soin de la première partie de votre requête qui est toujours le même dans cette action:

class Package < ActiveRecord::Base 
    named_scope :late_deliveries, :conditions => "actual_delivery IS NOT NULL AND actual_delivery > scheduled_delivery" 
end 

maintenant vous pouvez factoriser votre action comme ceci:

def index 
    conditions = {} 
    [:status, :carrer].each{|param| conditions[param] = params[param] if params[param]} 

    @packages = Package.late_deliveries.find(:conditions => conditions) 
end 

Si: transporteur et: état sont les deux seuls paramètres à cette action, il est encore plus simple:

def index 
    @packages = Package.late_deliveries.find(:conditions => params) 
end 

J'espère que cela aide!

+0

Les oscilloscopes peuvent-ils fonctionner avec quelque chose comme 'will_paginate'? – Shpigford

+0

Oui, c'est le cas. Remplacez simplement ".find" par ".paginate" dans les exemples ci-dessus, en ajoutant les paramètres page/per_page selon les besoins. –