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">]

質問:時間に応じて、通貨 (ヘッダー) に基づいてテーブルを動的に表示する必要があります。レートが存在する場合は表示し、それ以外の場合は出力は nil です。以下の表のように:

ここに画像の説明を入力

私はこれをやろうとしました:

<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 つの AUD で更新されており、続行方法がわからないため、これは機能しません。助けてください。

どうもありがとう。

4

2 に答える 2

1

group_byそのためにレールヘルパーを使用できます。ドキュメントを参照してください:

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>

HTH

編集:これは、配列が常に期待どおりの順序になるように配列に依存しすぎているため、この問題を解決するには非効率的な方法のようです。私はむしろハッシュ(キーと値のペアとして知られている)を作成したいと思い@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使い分ければよかったのですが、そういうことは初心者の段階でしっかりと学んでおいたほうがいいのではないでしょうか。勝手に書いたので、何かありましたらコメントお願いします。

HTH

于 2013-10-10T13:36:37.123 に答える