根据条件动态显示表格

时间:2013-10-10 13:18:43

标签: ruby-on-rails

你好我的同事们,我是一个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">]

问题我需要根据货币(标题)动态显示表格,具体取决于时间,如果费率存在,那么我显示它,否则输出为零。如下表所示:

enter image description here

我试过这样做:

<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,我不知道如何继续。请帮忙。

非常感谢。

2 个答案:

答案 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