2009-04-23 5 views
2

J'ai une collection d'enregistrements dans ma base de données que je veux imprimer pour séparer les tables en fonction de la date d'enregistrement.Rails: Génération de tables basées sur des groupes d'enregistrements de base de données connexes

J'ai donc déjà les éléments suivants (en Haml, FYI):

%table 
    %tr 
    %th Name 
    %th Type 
    %th Total Hits 
    - for record in @records 
    %tr{ :class => cycle('odd','even') } 
     %td= record.name 
     %td= record.target_type 
     %td= record.outbound + record.detail + record.custom + record.dynamic 

Actuellement, il affiche tous mes enregistrements de la même table. record.recorded_on contient la date de mes dossiers. Je veux générer des tables séparées, comme celle ci-dessus, pour chaque jour qui contient tous les enregistrements de ce jour.

Comment est-ce que je ferais ceci?

Répondre

3

En supposant recorded_on est une date, et non un DateTime:

@records = Record.all.group_by(&:recorded_on) 

Si c'est un DateTime:

@records = Record.all.group_by { |record| record.recorded_on.to_date } 

Maintenant @records contient des tableaux imbriqués. Collez votre table haml ci-dessus dans un partiel nommé _record_table.html.haml. Assurez-vous de remplacer @records par une variable locale records afin de pouvoir l'échanger pour chaque rendu partiel.

Maintenant votre modèle haml ressemble à ceci:

- @records.each do |records_for_one_day| 
    = render :partial => 'render_table', :locals => { :records => records_for_one_day } 
+0

Merci - exactement ce que je avais besoin. Par curiosité, cependant, que signifie "&:" dans @records = Record.all.group_by (&: recorded_on)? – neezer

+1

&: est un élément appelé Symbol # to_proc, c'est un moyen d'abréger les appels aux méthodes avec des blocs. Ainsi, group_by (&: recorded_on) a le même effet que: group_by {| record | record.recorded_on} –

+0

Max a raison. Dans le deuxième exemple que j'ai mis là-bas, j'ai dû utiliser la version longue parce que je voulais aussi traiter un peu le résultat, ce que la version abrégée ne supporte pas. –

Questions connexes