2

各位程序员,您好,我是一名 ruby​​ on rails 菜鸟,需要一些帮助:

根据今天的日期,我正在查询数据库并将结果作为数组获取。

    @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>

这不起作用,因为该广告已更新为 2 澳元,我不知道如何继续。请帮忙。

非常感谢。

4

2 回答 2

1

您可以group_by为此使用 rails 助手。请参阅文档:

group_by() 将可枚举对象收集到集合中,按块的结果分组。例如,用于按日期对记录进行分组。

例子:

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"
于 2013-10-10T13:36:16.850 回答
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>

高温高压

编辑:这似乎是解决此问题的一种低效方法,因为您过于依赖数组,而数组总是按您期望的顺序排列。我宁愿创建一个类似的哈希(更好地称为键值对)@cr等等{'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选择性地使用,但我想,如果你坚持在初学者阶段学习这些东西会更好。这是我从头顶写的,如果有什么问题,请发表评论。

高温高压

于 2013-10-10T13:36:37.123 回答