2011-09-12 2 views
0

J'ai une application qui utilise un calendrier, et je voudrais fournir un résumé du calendrier lors de la connexion. Le résumé doit être formaté il affiche les événements pour aujourd'hui, demain, et cette semaine, comme celui-ci:Rails: regrouper des partiels basés sur un attribut

les événements pour

Aujourd'hui

  • événement 1

Demain

  • Événement 2
  • Evénement 3
  • événement 4

cette semaine

  • Evénement 5
  • Evénement 6
  • Evénement 7
  • événement 8

Comment est-ce que je rends les partiels afin qu'ils soient groupés correctement, en fonction de leur date?

Répondre

0

un premier pourrait ajouter une méthode de modèle for_dates (start_date, date_fin) qui contiendrait: where([:date_column >= ? and :date_column <= ?, start_date, end_date])

Ensuite, utilisez:

Model.for_dates(Date.today, Date.today)

Model.for_dates(Date.today+1, Date.today+1)

Par défaut 'semaine' est dimanche au lundi. Ajoutez un décalage si vous souhaitez des jours différents, par ex.

du lundi au vendredi est

Model.for_dates(Date.today.beginning_of_week+1, Date.today.end_of_week+1)

0

Supposant votre modèle est appelé Event et il a un attribut date, et votre collection de ces derniers est appelé @events, voici une idée: mettre ceci dans votre vue .. .

<ul> 
<%= render @events, locals: { events: @events } %> 
</ul> 

... vous auriez alors un appelé partielle _event.html.erb qui ressemble à ceci:

<% last_event = event_counter == 0 ? nil : events[event_counter - 1] 
    next_event = events[event_counter + 1] 
%> 
<% if last_event && last_event.date != event.date 
    # add a new date header and start a new nested list of events 
%> 
    <li><h3><%= event.date %></h3> 
    <ul> 
<% end %> 

     <li><%= link_to event %></li> 

<% if next_event && next_event.date != event.date 
    # end the nested list and make way for the next date header and set of events 
%> 
    </ul> 
    </li> 
<% end %> 

Qu'est-ce happing est dans l'appel render nous transmettons dans toute la collection @events comme local appelé events. Ensuite, à l'intérieur du partiel, nous utilisons la méthode event_counter générée automatiquement pour rechercher les événements précédents (events[event_counter - 1]) et suivants (events[event_counter + 1]) dans la collection.Ensuite, si la date du event actuel est différente de la date de last_event (ce qui signifie que c'est le premier pour cette date), nous commençons un nouvel ensemble avec une nouvelle date, et si la date de event est différente de la date de next_event (c'est à dire le dernier pour cette date) nous terminons l'ensemble.

C'est un peu moche, et il y a des façons plus élégantes de le faire à coup sûr, mais cela fait l'affaire.

Questions connexes