order ou sort_by ou autre chose ?

Par Amstramgram, il y a 11 ans


Bonjour,

je cherche à trier mes projects par le nombre de jours restant (project.end_date - Time.now) mais je ne comprend pas comment faire pour l'intégrer dans mon controller pour récuperer par défaut cet ordre la, quelqun pour me venir en aide ?

Je fais ca : @projects = Project.all.order(days_until_end(project.end_date - Time.now))

mais ca ne réorganise pas la liste.

Merci.

6 réponses

Grafikart, il y a 11 ans

Tu peux pas le faire directement avant de faire le all genre dans la requete SQL ?

Amstramgram, il y a 11 ans

Bah je ne fais pas de requete SQL. Je passe par ca :

def index @projects = Project.all.order(days_until_end(project.end_date - Time.now)) end
Grafikart, il y a 11 ans

Pour ça que je te dis que tu verais mieux de le faire à travers la requete plutot

Amstramgram, il y a 11 ans

Ok. Et est ce que quelque chose comme cela pourrais fonctionner ? J'ai testé mais je ne comprends pas vraiment. Il y a une erreur " undefined method `Project' " , ok Project n'est pas défini, mais pourquoi ?

before_action :int_day, only: [:index] def index @projects = Project.all.sort_by(&:int_day).reverse end private def int_day time = (self.Project.end_date - Time.now) days = (time / (3600*24)) end

En réalité je ne sais absolument pas ce que je suis entrain de faire. :)

kal-el, il y a 11 ans

La clause order requiert des symboles en argument (Les symboles correspondant aux noms de tes champs)

def index @projects = Project.all.order(:days_left) # ou bien @projects = Project.all.order(days_left: :desc) end

Apres si tu veux avoir la liste seulement de ceux répondant a un certain critère, rajoute un where dans ta requête :

def index @projects = Project.where('days_left <= ?', int_day()).order(days_left: :desc) end
Amstramgram, il y a 11 ans

Merci pour ta réponse, entre temps j'ai trouvé une solution qui parait fonctionner. Je récupére tous mes projets et je fais un classement sur la date de fin du projet. Normalement le nombre de jour restant et lié à la date de fin et la date du jour. Du coup ca doit être dans l'autre au final.

Dans ma view

- @projects.sort{ |a,b| a.end_date <=> b.end_date }.each do |project|