2010-06-06 7 views
0

J'utilise search logic pour filtrer les résultats sur la fiche de la société. L'utilisateur peut spécifier n'importe quel nombre de paramètres en utilisant une variété d'URL nommées. Par exemple:DRYing Recherche Logique dans Rails

/lieu/Mexique
/secteur/technologie
/secteur/financier/lieu/argentina

résultats dans les domaines suivants respectivement:

params[:location] == 'mexico' 
params[:sector] == 'technology' 
params[:sector] == 'financial' and params[:location] == 'argentina' 

J'essaie maintenant de nettoyer ou "SEC" mon code de modèle. Actuellement, j'ai:

def self.search(params) 
    ... 
    if params[:location] 
     results = results.location_permalink_equals params[:location] if results 
     results = Company.location_permalink_equals params[:location] unless results 
    end 
    if params[:sector] 
     results = results.location_permalink_equals params[:sector] if results 
     results = Company.location_permalink_equals params[:sector] unless results 
    end 
    ... 
end 

Je n'aime pas répéter les recherches. Aucune suggestion? Merci.


Répondre

1

Voilà comment je l'écrirais:

[params[:location], params[:sector]].reject(&:nil?).each do |q| 
    results = (results ? results : Company).location_permalink_equals q 
end 

Il y a beaucoup d'autres façons, juste une idée. A l'avantage de le rendre facile à ajouter dire params[:street] ou quelque chose.

+1

utilisation compacte au lieu de rejeter: - il devrait être plus rapide et fait la même chose (et nul?). Vous pouvez aussi essayer params.values_at (: emplacement,: secteur) .compact.each ... – hurikhan77

+0

Bonnes idées. J'aime "rejeter nil" car il est immédiatement clair ce qu'il fait. 'values_at' est génial, surtout s'il y avait plus de paramètres. –

1

Je ne pense pas que vous pouvez vraiment sec jusqu'à quand bien coller à SearchLogic ... Je vous suggère d'affiner vos itinéraires pour émettre directement *_permalink comme noms de paramètres et faire quelque chose comme ceci:

Company.all :conditions => params.slice(:location_permalink, :sector_permalink) 

ou

Company.find :all, :conditions => params.slice(:location_permalink, :sector_permalink) 

lien Documentation: http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Slice.html

Questions connexes