2010-07-14 3 views
0

J'ai un modèle de ticket qui a une méthode interne appelée closes_in qui calcule le temps restant à partir du champ de base de données start_date:date à maintenant. Actuellement, ma requête de recherche est:Tri d'un "Find" en utilisant des méthodes plutôt que des champs dans la base de données

@tickets = Ticket.find(:all, 
         :origin => @user.coords, 
         :order => 'distance', 

Je ne peux pas simplement mettre closes_in car j'obtiens une erreur. Comment faire pour que je puisse utiliser closes_in pour trier la requête s'il s'agit d'une méthode et non d'un champ réel dans la base de données?

Répondre

0

Si vous utilisez MySQL:

@tickets = Ticket.all(:order => "DATEDIFF(CURDATE(), start_date)") 

Si vous utilisez PostgreSQL:

@tickets = Ticket.all(:order => "AGE(start_date)") 

De cette façon, vous utilisez DB pour le tri . Le tri à l'aide de ruby ​​doit être limité à un petit ensemble de données dont la taille est garantie.

+0

Merci, est-ce que ça fonctionne pour Postgres? – Kevin

+0

J'ai mis à jour la réponse avec une solution pour PostgreSQL –

+0

Merci! Donc, dans ce cas, je vais probablement aller avec votre solution, mais il sera utile de connaître l'alternative Ruby que jpemberthy mis ci-dessus pour d'autres méthodes compliquées qui pourraient ne pas être facile à calculer dans la base de données. – Kevin

2

Utilisez la méthode sort_by:

@tickets = Ticket.find(:all, :conditions => "foo").sort_by { |t| t.closes_in } 
+0

Comment contrôlez-vous dans cet exemple le tri ascendant ou descendant? – Kevin

+0

Par défaut, la méthode 'sort_by' retournera la collection ordonnée' ASC', pour l'ordre 'DESC' vous devez annuler les éléments' sort_by', par exemple: 'Ticket.find (: all,: conditions =>" foo ") .sort_by {| t | -t.closes_in} '(notez que le '-') renvoie les' @ tickets' commandés 'DESC'. – jpemberthy

Questions connexes