循环复选框的记录

时间:2010-10-11 11:46:50

标签: ruby-on-rails ruby

我有这个data,你可以看到我有大约10个请求。请求包含场地,歌曲,日期和艺术家。我需要循环这些请求,如果有两个请求同一个歌曲发送到同一地点和日期,那么我需要添加到一个复选框。例如:

#<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>,

正如你所看到的,我有两个请求同一场地,同一个日期和同一首歌。我想要一个循环,它将在视图中创建复选框,但如果它遇到具有相同日期信息的相同歌曲,则在复选框数组中添加id .. like this

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

另外,我只会在数组中有一个用于该复选框的是唯一一个

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

@past_requests是包含所有请求的数组... 关于如何实现这个的任何想法

2 个答案:

答案 0 :(得分:1)

如果您能够提出group_by功能,通过场地,日期和歌曲的组合进行分组,那么这将简化问题。

e.g。作为一个简单的例子,我们可以使用连接字符串作为键:

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

然后可以使用以下内容生成复选框:

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

请注意,我们不关心我们对歌曲名称使用哪个请求,因为分组中的所有请求都有相同的歌曲,因此我们可以使用requests.first.song

或者,您可以查看将场地/日期/歌曲提取到Performance模型中,然后将请求链接到表演。这可能会简化事情。

答案 1 :(得分:0)

使用Rails / ActiveSupport group_by方法

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

需要考虑的事项

  • 我创建了song_id属性,我无法分辨8,9,10是什么
  • 这似乎是一种奇怪的方式,你可以将所有内容整合在一起并逐一进行。