2009-06-23 4 views
3

Est-il possible dans ruby ​​/ rails de commander un ensemble de résultats après avoir fait une recherche? Par exemple, est-il possible de faire quelque chose comme çaPouvez-vous faire un: ordre en ruby ​​après une trouvaille?

Attention: Ne fonctionne pas

if type == 1 
    @items = mycompany.items 
else 
    @items = myhome.items 
end 

@items = @items :order => "created_at" 

Je suppose que quelque chose comme cela devrait être possible, mais je suis encore très nouveau pour RoR et peut ne semble pas trouver quoi que ce soit sur google.

Répondre

4

Je ne sais pas pourquoi tout le monde est tout "Non vous ne pouvez pas" quand c'est possible dans les portées nommées.

Par exemple, définir dans le cadre de ActiveRecord :: Base:

named_scope :by_created_at, :order_by => 'created_at' 

Cela vous permet de convertir une relation simple à un commandé un avant qu'il ne soit récupéré:

@items = @items.by_created_at 

En Notez que ce n'est pas une bonne idée d'inclure des étendues qui se chevauchent: les définitions de commande, car elles sont ajoutées au lieu de les chevaucher à tour de rôle.

Cependant, dans votre exemple, il n'y a pas trop d'un tronçon d'imaginer refactorisation comme les suivantes:

reference = 
    case (type) 
    when 1 
    mycompany 
    else 
    myhome 
    end 

@items = reference.items.all(:order_by => 'created_at') 
6

Vous devriez être en mesure de faire un de ces:

Trier lors de l'accès:

if type == 1 
    @items = mycompany.items(:order => 'created_at') 
else 
    @items = myhome.items(:order => 'created_at') 
end 

Trier après l'accès:

@items.sort{|a,b| a.created_at <=> b.created_at} 
5

Vous pouvez également utiliser le Symbol to Proc shorthand disponible dans des rails, avec Enumerable#sort_by pour simplifier votre instruction de tri, si vous souhaitez trier après la collecte des objets ActiveRecord:

@items.sort_by(&:created_at) 
# is the same as @items.sort{ |a, b| a.created_at <=> b.created_at } 
Questions connexes