2010-06-02 9 views
1

J'ai une page de liste simple avec un couple de statut de filtres de recherche qui est une énumération simple et une requête de test que je veux comparer à la fois le titre et le champ de description de mon modèle.Mélange facultatif de paramètres de filtre dans une recherche de la manière Rails

Dans mon contrôleur, je veux faire quelque chose comme ceci:

def index 
    conditions = {} 
    conditions[:status] = params[:status] if params[:status] and !params[:status].empty? 
    conditions[???] = ["(descr = ? or title = ?)", params[:q], params[:q]] if params[:q] and !params[:q].empty? 
    @items = Item.find(:all, :conditions => conditions) 
end 

Malheureusement, il ne semble pas que je peux mélanger les deux types de conditions (le hachage et la version paramatized). Est-il un « Way Rails » de le faire ou dois-je simplement faire quelque chose de terrible comme ceci:

has_status = params[:status] and !params[:status].empty? 
has_text = params[:q] and !params[:q].empty? 
if has_status and !has_text 
    # build paramatized condition with just the status 
elsif has_text and !has_status 
    # build paramatized condition with just the text query 
elsif has_text and has_status 
    # build paramatized condition with both 
else 
    # build paramatized condition with neither 
end 

Je migration d'Hibernate et critères alors pardonnez-moi si je ne pense pas à cela correctement. ..

Environnement: Rails 2.3.4

Répondre

2

Vous pouvez mélanger hachage et conditions de tableau en utilisant les étendues:

hash_conditions = {} 
# build hash_conditions 

items_scope = Item.scoped(:conditions => hash_conditions) 

unless params[:q].blank? 
    items_scope = items_scope.scoped(:conditions => ["(descr = ? or title = ?)", params[:q], params[:q]]) 
end 

... 

items = items_scope.all 

Ainsi, vous pouvez mélanger et faire correspondre tous les types de conditions, et la requête sera exécutée uniquement lorsque vous faites items_scope.all

+0

Juste pour clarifier, est-ce que le "scoped" est disponible dans Rails 2.x ou est-ce une amélioration de Rails 3? – GSP

+0

Il est disponible depuis que named_scope-s a été ajouté - depuis Rails 2.1.0. C'est juste une portée nommée, qui est définie pour toutes les classes ActiveRecord. Voir http://apidock.com/rails/ActiveRecord/NamedScope/included/class – Voyta

0
a=[],b=[] 
unless params[:status].blank? 
    a << "status = ?" 
    b << params[:status] 
end 
unless params[:q].blank? 
    a << "(descr = ? or title = ?)" 
    b << params[:q] << params[:q] 
end 
@items = Item.all(:conditions => [a.join(" AND "), b]) 
0

Une meilleure recherche de ma part relevai quelque chose appelé « named scopes » qui ressemble est exactement ce que je cherche. Je suis sur le point de voir si elle va travailler avec la gemme will_paginate ....

Référence: http://edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/

+0

Cela fonctionne très bien avec will_paginate. @items = Item.filtered_by_test (params [: requête]). paginate (: conditions => conditions) Ceci est ma nouvelle fonctionnalité de rails préférés! – GSP

Questions connexes