order ou sort_by ou autre chose ?

17372
,

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éponse

1
,

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

17372
,

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
1
,

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

17372
,

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. :)

Default
,

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
17372
,

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|