你好我的同事们,我是一个ruby on rails noob并需要一些帮助:
根据今天的日期,我正在查询数据库并将结果作为数组获取。
@cr = [#<CRate id: 1, currency: "AUD", rate: 2.0, datetime: "2013-10-09 22:59:59">,
#<CRate id: 7, currency: "USD", rate: 10.0, datetime: "2013-10-09 29:50:50">,
#<CRate id: 9, currency: "EUR", rate: 20.0, datetime: "2013-10-09 22:59:59">,
#<CRate id: 12, currency: "RUB", rate: 12.0, datetime: "2013-10-09 22:59:59">,
#<CRate id: 14, currency: "AUD", rate: 18.0, datetime: "2013-10-09 29:50:50">]
问题我需要根据货币(标题)动态显示表格,具体取决于时间,如果费率存在,那么我显示它,否则输出为零。如下表所示:
我试过这样做:
<table>
<thead>
<th>Time</th>
<% @currency = @cr.collect(&:currency) %>
<% @currency.each do |cur| %>
<th><%= cur %></th>
<% end %>
</thead>
<tbody>
<tr class="<%= cycle('odd', 'even') %>">
<td><%= @datetime = @cr.collect(&:datetime) %></td>
<% @rate = @cr.collect(&:rate) %>
<% @rate.each do |r| %>
<td><%= r %></td>
<% end %>
</tr>
</tbody>
</table>
这不起作用,因为thead更新了2 AUD,我不知道如何继续。请帮忙。
非常感谢。
答案 0 :(得分:1)
你可以使用group_by
rails helper。见文档:
group_by()将一个可枚举的集合收集到一组中,按照a的结果分组 块。例如,按日期对记录进行分组很有用。
示例:
latest_transcripts.group_by(&:day).each do |day, transcripts|
p "#{day} -> #{transcripts.map(&:class).join(', ')}"
end
"2006-03-01 -> Transcript"
"2006-02-28 -> Transcript"
"2006-02-27 -> Transcript, Transcript"
"2006-02-26 -> Transcript, Transcript"
"2006-02-25 -> Transcript"
"2006-02-24 -> Transcript, Transcript"
"2006-02-23 -> Transcript"
答案 1 :(得分:1)
首先,您需要唯一的货币类型,因此行号。 4将是:
<% @currency = @cr.collect(&:currency).uniq %>
其次,你需要根据日期时间和货币类型获得费率(因为你没有指定Rails版本,我会尝试编写一个可能不是最佳解决方案的工作解决方案):
<tbody>
<% @datetime = @cr.collect(&:datetime).uniq %>
<% @datetime.each do |dt| %>
<tr class="<%= cycle('odd', 'even') %>">
<td><%= dt %></td>
<% @currency.each do |curr| %>
<td><%= @cr.select {|o| o.currency == curr && o.datetime == dt}.rate %></td>
<% end %>
</tr>
<% end %>
</tbody>
HTH
编辑:这似乎是一种解决此问题的低效方法,因为您过分依赖数组,而这些方式总是按照您期望的顺序排列。我想创建一个@cr
的Hash(更好地称为键值对),如{'first_datetime' => {'AUD' => '10', 'RUB' => '20'}, 'second_datetime' => {'AUD' => '50', 'RUB' => ''}}
,等等。
编辑2:在你的控制器中,创建一个哈希和2组,如:
@currencies = Set.new
@datetimes = Set.new
@currency_rate_datewise = Hash.new {|h, k| h[k] = {}}
@cr.each do |cr|
@currencies.add cr.currency
@datetimes.add cr.datetime
@currency_rate_datewise[cr.datetime][cr.currency] = cr.rate
end
现在您的观点可以简化为:
<table>
<thead>
<th>Time</th>
<% @currencies.each do |cur| %>
<th><%= cur %></th>
<% end %>
</thead>
<tbody>
<% @datetimes.each do |datetime| %>
<tr class="<%= cycle('odd', 'even') %>">
<td><%= datetime %></td>
<% @currencies.each do |currency| %>
<td><%= @currency_rate_datewise[datetime][currency] || 'nil' %></td>
<% end %>
</tr>
<% end %>
</tbody>
</table>
虽然,我会选择性地使用group_by
,但我想,如果你坚持在初学者阶段学习这些东西会更好。我是从头脑中写下来的,如果出现问题,请发表评论。
HTH