2010-06-02 7 views
0

Je veux récupérer les messages en fonction de leur statut, donc j'ai ce code dans mon action PostsControllerindex. Il semble que l'action de l'index soit encombrée, et je ne suis pas sûr que cela appartienne ici.Comment refactoriser ce code Ruby on Rails?

Comment pourrais-je le rendre plus concis et où devrais-je le déplacer dans mon application afin qu'il n'encombre pas mon action d'index (si c'est la bonne chose à faire)?

if params[:status].empty? 
    status = 'active' 
else 
    status = ['active', 'deleted', 'commented'].include?(params[:status]) ? params[:status] : 'active' 
end 

case status 
when 'active' 
    #active posts are not marked as deleted and have no comments 
    is_deleted = false 
    comments_count_sign = "=" 
when 'deleted' 
    #deleted posts are marked as deleted and have no comments 
    is_deleted = true 
    comments_count_sign = "=" 
when 'commented' 
    #commented posts are not marked as deleted and do have comments 
    is_deleted = false 
    comments_count_sign = ">" 
end 

@posts = Post.find(:all, :conditions => ["is_deleted = ? and comments_count_sign #{comments_count_sign} 0", is_deleted]) 

Répondre

2
class Post < ActiveRecord::Base 
    named_scope :active, :conditions => { :is_deleted => false, :emails_count => 0 } 
    named_scope :sent, :conditions => ["is_deleted = ? AND emails_count > 0", true] 
    ... 
end 

utiliser comme Post.active.all, Post .active.first, Post.active.each, etc

puis

status = %w'active deleted sent'.include?(params[:status]) : params[:status] : 'active' 
@posts = Post.send(status).all 
2

Je considère l'ajout d'une méthode de classe à Post

def file_all_based_on_status status 

    # custom logic for queries based on the given status here 
    # handling nils and other cases 

end 

De cette façon, votre index Controller est simple

def index 
    @posts = Post.find_all_based_on_status params[:status] 
end 
+0

+1 c'est ce que j'allais suggérer aussi –

+0

merci! Je pense que vous vouliez dire 'def find_all_based_on_status status' pas' def file_bas_based_on_status status'. Mémoire musculaire au travail. De même, existe-t-il un moyen de rendre le code de recherche lui-même plus concis? –

+1

Faites que votre méthode finder utilise des étendues nommées comme la réponse de @ zed_0xff –