2011-02-10 4 views
1

Création d'une méthode de recherche dans mon modèle et conditions de jointure basées sur les arguments transmis à la méthode. Cependant, rien ne s'enchaînée après la première « où »Rails: chaînage de méthodes dans le modèle

Controller:

Item.search(args) 

Modèle:

def self.search(args = {}) 
    include ActsAsTaggableOn # Tagging model for search 

    result = where("title LIKE ? OR description LIKE ? OR tags.name LIKE ?", "%#{args[:search]}%", "%#{args[:search]}%", "%#{args[:search]}%") 
     .joins("JOIN taggings ON taggings.taggable_id = items.id") 
     .joins("JOIN tags ON taggings.tag_id = tags.id") 

     # Categories 
     if args[:categories] 
     result.where(:category_id => args[:categories]) 
     end 

     # Order 
     if args[:order] == "category" 
     result.joins(:categories).order("categories.title ASC") 
     else 
     result.order("title DESC") 
     end 


     # Pagination 
     result.paginate(:per_page => 10, :page => args[:page]) 

end 

Même si je bande le si bloc et faire une chaîne directement après, il doesn 't de travail:

result = where(:foo => "bar") 
result.order("name DESC") 

... fonctionne juste où.

Des idées?

Merci d'avance.

Répondre

3

Ce que vous devez faire est de la chaîne en ajustant la définition de result que vous allez:

result = result.where(...) 

Chaque fois que vous devez réassigner Retour au premier résultat de la portée mise à jour. C'est parce que result.where renvoie une nouvelle portée, il n'ajuste pas la portée existante.

+0

merci beaucoup! – jmccartie

Questions connexes