2010-10-15 3 views
2

Dans une application Rails 3, j'utilise un group_by quelque peu complexe et je suis curieux de savoir si je peux le cacher ailleurs, tout comme on peut cacher des conditions ActiveRecord dans une lunette. Je me rends compte group_by est une opération sur un Enumerable, donc champs d'application ne s'appliquent pas ici, mais ma question est s'il y a un moyen de créer un raccourci pour cela d'une manière comparable:Comment pourrais-je cacher une clause group_by complexe dans Ruby?

@launches_and_finales = Show.launches_and_finales.sort_by { |s| 
    (s.run_starts_on && 
    ((Date.today - 3.days)..(Date.today + 3.days)) === s.run_starts_on) ? 
    s.run_starts_on : s.run_ends_on } 

Side note: Je me rends compte 3.days.ago..3.days.from_now serait plus succint, mais il y a un bug in Ruby 1.9.2 qui déclenche une boucle sans fin quand j'utilise ça.

Répondre

1

Je pense que vous pouvez mettre en œuvre ce en utilisant l'un de ces deux stratégies:

  1. Wrap la logique dans une extension d'association
  2. Rails Arel de 3 pourraient vous aider WRAP dans un appel standard méthode

    classe Afficher

    def self.launches_and_finales

    where(["run_starts_on between ? and ? or ...", Time.now - 3.day, Time.now + 3.days]) 
    

    fin

    fin

+0

Je ne l'avais pas pensé à faire une logique plus complexe à la couche de modèle. Je dois avoir seulement considéré les limites avec leurs limitations ici, mais bien sûr je peux juste ajouter une toute nouvelle méthode. Je ne pense pas que 2 fera l'affaire cependant, puisque c'est le groupe le plus complexe_par ce que je suis après, pas seulement le filtre. –

Questions connexes