2015-07-15 1 views
0

Je crée une application de planification dans Rails et je suis coincé en essayant d'organiser les salles par date. Quand je dis une pièce, je veux dire essentiellement un bloc dans l'annexe. Un événement typique peut avoir un déjeuner (une pièce), puis une section de mise en réseau (une autre pièce). Voici comment je reçois les chambres:Organisation par des rails datetime dans la vue

@rooms = Room.where(event_id: @current_event.id).order(:start_time) 

donc qui retourne les pièces qui appartiennent à un événement, dans l'ordre du temps de démarrage. À mon avis, je traverse et affiche les salles pour l'événement, mais je veux les regrouper dans la vue par la date au cas où il y a un événement qui est sur plusieurs jours.

Egalement :start_time est un type datetime dans Ruby. En langage humain, ce que je ferais est de regarder la partie date et si la date de la pièce n'est pas la même que celle du groupe actuel, j'imprimerais la nouvelle date et continuerais à regrouper les pièces qui tombent ce jour-là. Voici un exemple trivial au cas où je ne suis pas clair:

Event: Staff Retreat 

July 14th, 2015 
----------------------- 
12:30 PM 
Team building Lunch Begins 
------------------------ 
6:30 PM 
Team building Dinner Begins 
------------------------ 

July 15th, 2015 
------------------------ 
9:30 AM 
Team building Breakfast Begins 

Donc, avoir le regroupement des chambres dans la variable @rooms qui est un datetime, quelle serait la meilleure façon d'afficher une table comme celle-ci? Je pense que dans ma boucle que je devrais vérifier si la date était la même que la salle précédente, et sinon imprimer la date

- @rooms.each do |room| 
    room.start_time.strftime("%B %d, %Y") 
    room.start_time.strftime("%I:%M%p") 
    room.name 

Je ne parviens pas à la logistique, car avec le concept Model-View-Controller , Je pense que trier dans la vue peut avoir la vue de faire quelque chose qu'il ne devrait pas avoir à faire. Je me bats aussi avec la façon de le faire dans la vue. Je pense que le fait de définir une variable dans le contrôleur qui contiendrait la date temporaire en boucle fonctionnerait, mais il semblerait que cela commence à devenir plutôt désordonné. Quel est le meilleur moyen de regrouper les différentes dates de la variable @rooms?

Répondre

1

Pouvez-vous essayer ça. cela vous renverra un hash où la date est la clé et la valeur contiendra toutes les @chaines liées à cette heure.

@rooms = Room.where(event_id: @current_event.id) 
@rooms = Hash[@rooms.sort_by{|o| o.start_time.to_date}.group_by {|room| room.start_time.to_date}.map{|l,m| [l, m.sort_by{|k| k.start_time}]}] 

maintenant vous pouvez traverser les chambres comme ça dans les vues. Im mettant le code au format erb.

<% @rooms.each do |k, v| %> 
    <%= k %> 
    <% v.each do |room| %> 
     <%= room.created_at.start_time('%I:%M %p')%> 
     <%= #room.name or title what so ever. %> 
    <% end %> 
    <% end %> 
+0

Merci! Cela les a regroupés comme je le voulais, mais avec un problème, les dates sont hors service. Une chambre est sur le 7-13 qui est le premier, puis deux chambres sont sur le 15 et ceux viennent deuxième, puis theres une chambre sur le 14 qui vient en dernier, et l'ordre n'est pas l'ordre qu'ils ont été créés. Je vais poster des entrées de modèles de chambres en espérant que cela aidera – ajk4550

+0

nom: "Room Test", created_at: "2015-07-13 20:03:08", updated_at: "2015-07-13 20:03:08", event_id: 1, start_time: "2015-07-13 17:30:00">, # , # , # ]> – ajk4550

+0

J'ai mis à jour ma réponse. pouvez-vous essayer maintenant s'il vous plaît. J'espère que cela fonctionnera – Athar