2010-10-12 5 views
0

Existe-t-il un modèle pour refactoriser une telle construction en une seule ligne lisible?Modèle de refactorisation commun pour le modèle Rails

def show_section 
    @news = News.all_active 
    @news = @news.where(:section => params[:section]) unless params[:section] == "all" 
    @news = @news.all 
end 

J'utilise Rails 3 et Ruby 1.9.2

Répondre

3
@news = News.all_active.where(params[:section] == "all" ? nil : {:section => params[:section]}) 

Vous pouvez vous débarrasser de @news.all - dans Rails 3 requête sera exécutée lorsque vous utilisez l'objet ActiveRecord::Relation résultant (par exemple lorsque vous appelez each ou first dessus). Passer la méthode nil à where ne fera rien.

Si all_active est une méthode, vous pouvez la refactoriser dans une étendue, puis l'appeler dans une chaîne.

grandes ressources sur Rails 3 requêtes:

+0

La construction d'une portée de nouvelles est une excellente idée, merci! – Fu86

1

Vous pouvez activer la clause where dans une méthode sur votre modèle Nouvelles:

class News 
    def self.for_section(section) 
     where(section == "all" ? nil : {:section => section}) 
    end 
end 

Ensuite, dans votre contrôleur, vous pouvez enchaîner tous ensemble comme ceci:

News.for_section(params[:section]).all_active 

Ceci suppose bien entendu que all_active est aussi une portée, et non un jeu de résultats.

+0

Merci beaucoup pour ça! – Fu86

Questions connexes