2010-10-11 5 views
1

J'ai ce data et comme vous pouvez le voir, j'ai environ 10 demandes. Une demande a un lieu, une chanson, une date et un artiste. J'ai besoin de boucler ces demandes et s'il y a deux demandes avec la même chanson faite au même endroit et à la même date, alors je dois ajouter puis à une case à cocher. Par exemple:En boucle les enregistrements pour une case à cocher

#<Request id: 8, artist: "Metallica", song: "Turn the Page", venue: 
"Rod Laver Arena at Melbourne Park - Melbourne Vic", showdate: "2010-10-09", 
amount: nil, user_id: 6, created_at: "2010-10-09 01:32:26", 
updated_at: "2010-04-09 01:32:26", like_reason: "Its a good song", pledge: 100>, 

#<Request id: 9, artist: "Metallica", song: "Turn the Page", venue: 
"Rod Laver Arena at Melbourne Park - Melbourne Vic", showdate: "2010-10-09", 
amount: nil, user_id: 6, created_at: "2010-10-09 01:32:26", 
updated_at: "2010-05-09 01:32:26", like_reason: "Its great", pledge: nil>, 

#<Request id: 10, artist: "Metallica", song: "Enter Sandman", venue: 
"Aector Arena - Auckland Central, New Zealand", showdate: "2010-10-11", 
amount: nil, user_id: 6, created_at: "2010-10-09 01:32:26", 
updated_at: "2010-05-09 01:32:26", like_reason: "good tune", pledge: nil>, 

Comme vous pouvez le voir, j'ai deux demandes au même lieu et la même date et la même chanson. Je veux une boucle qui va créer des cases à cocher dans la vue, mais si elle rencontre la même chanson avec les mêmes informations de date, puis ajouter l'identifiant dans la case array..like ce

<input value="Turn the Page" name="song[8, 9]" type="checkbox"> 

autrement je n'aurais un dans le tableau de cette case à cocher est que est le seul

<input value="Enter Sandman" name="song[10]" type="checkbox"> 

@past_requests est le tableau qui contiendra toutes les demandes ... toutes les idées sur la façon d'y parvenir

+0

Repéré que vous n'avez pas accepté la réponse à cette question. Cela signifie-t-il que vous avez un problème avec la solution proposée? – mikej

Répondre

1

Si vous pouvez créer une fonction group_by qui se regroupe par la combinaison du lieu, de la date et de la chanson, cela simplifiera le problème.

par exemple. comme un exemple simple que nous pourrions utiliser une chaîne concaténée comme la clé:

grouped_requests = requests.group_by do |req| 
    "#{req.artist}/#{req.song}/#{req.venue}/#{req.date}" 
end 

Ensuite, vos cases à cocher pourrait être générée avec:

<% grouped_requests.values.each do |requests| %> 
    <% request_ids = requests.collect { |request| request.id } %> 
    <%= check_box_tag requests.first.song, "song[#{request_ids.join(',')}]" %> 
<% end %> 

Notez que nous ne nous soucions qui demandent que nous utilisons pour la nom de la chanson car toutes les requêtes d'un regroupement ont la même chanson donc nous pouvons simplement utiliser requests.first.song

Alternativement, vous pouvez chercher à extraire le lieu/la date/la chanson dans un modèle Performance puis de lier les requêtes aux performances. Cela pourrait simplifier les choses.

0

Utilisez le Rails/ActiveSupport group_by méthode

@past_requests.group_by(&song_id).each do |song_id, requests| 
    ... #create the checkbox tag here 
end 

choses à considérer

  • J'ai créé l'attribut song_id, je ne pouvais pas dire ce que 8,9,10 étaient
  • Cela semble une façon bizarre pour vous de consolider tout vers le bas et le groupe par la chanson.
Questions connexes