2010-07-09 2 views
1

Maintenant j'entrer quelques données d'un formulaire et j'ai un code pour rechercher la base de données en entrant plusieurs paramètres comme conditions d'entrée. Maintenant, si l'un des paramètres est nul (c'est-à-dire que le champ n'est pas coché, j'ai besoin de remplacer ce paramètre par quelque chose disons * afin que la requête de recherche ne soit pas affectée. Comment ferais-je cela?Combinaison de conditions dans find. (Rails)

@report = Problem.find(:all, :conditions => ["problems.cause_id = ? and problems.location_id = ? and problems.device_id = ? and problems.priority_id = ?", Report.find_by_id(params[:id]).cause_id, Report.find_by_id(params[:id]).location_id, Report.find_by_id(params[:id]).device_id, Report.find_by_id(params[:id]).priority_id]) 

Répondre

1

Il serait préférable de ne pas avoir cette condition du tout que d'utiliser *. Dans ce cas, c'est simple car tous vos opérateurs de comparaison sont "=". Cela signifie que vous pouvez utiliser la forme de hachage des conditions. Votre code est également très inefficace lorsque vous chargez le même objet de rapport 3 ou quatre fois. Votre question à propos de l'un des params étant nulle n'a pas de sens pour cette raison: vous utilisez simplement le même param encore et encore. De même, vous définissez une variable appelée @report comme étant un objet Problème qui prête à confusion.

@report = Report.find_by_id(params[:id]) 
conditions = {:cause_id => @report.cause_id, :location_id => @report.location_id, :device_id => @report.device_id, :priority_id => @report.priority_id} 
conditions.delete_if{|k,v| v.blank?} 
@problem = Problem.find(:all, :conditions => conditions) 
+0

Merci c'est une solution vraiment soignée. Vous m'avez aidé avant aussi sur railsforums, merci encore – Prateek

1
rep = Report.find_by_id(params[:id]) 
cause = rep.cause_id ? rep.cause_id : '*' 
location = rep.location_id ? rep.location_id : '*' 
device = rep.device_id ? rep.device_id : '*' 
priority = rep.priority_id ? rep.priority_id : '*' 
@report = Problem.find(:all, 
         :conditions => ["problems.cause_id = ? and 
             problems.location_id = ? and 
             problems.device_id = ? and 
             problems.priority_id = ?", 
             cause, location, 
             device, priority 
             ] 
         ) 
+0

Wow, cela semble beaucoup mieux maintenant, mais le problème de null ne subsiste-t-il pas? c'est à dire si rep.cause_id était nul? – Prateek

+0

Comme Salil l'a écrit, le champ est remplacé par "*" s'il est nul. Prendre la ligne 'cause = rep.cause_id? rep.cause_id: '*' 'par exemple, il s'agit fondamentalement d'une syntaxe conditionnelle où 'cause = rep.cause_id' si rep.cause_id existe, ou' cause =' * ''si ce n'est pas le cas. En fait, il a répondu à la question exactement comme vous l'avez dit, en remplaçant les requêtes par * si elles sont nulles. – Karl

+0

Je n'ai pas compris le fonctionnement de ce code, donc merci pour l'explication ainsi que le code. – Prateek

Questions connexes