0

日付を持つログ オブジェクトがたくさんあります。ビューで私はそれらを見せています

<% @time_logs.each do |timelog| %>

同じ日付に発生した場合に複数のものが1つとしてのみ表示されるようにしたい場合:

Date: 10/11/11   Something: 1    Something else: 2
Date: 10/11/11   Something: 3    Something else: 4

Date: 10/11/11   Something: 4    Something else: 6

モデル、コントローラー、ビューでこれを行いますか? 新しいコントローラを作成する必要がありますか? そして、データを変更したり、別のデータベースに保存してそこからプルしたりすることなく、これを行う最良の方法は何ですか?

4

3 に答える 3

0

どのコントローラーがこのビューをレンダリングしているか、time_logs がモデル オブジェクトのコレクションであるかなど、アプリに関する詳細を知っておくとよいでしょう。

モデル、コントローラー、ビューでこれを行いますか?

この種の集計ロジックは、モデルに最適です。アプリに TimeLog というモデルがあると思います。

新しいコントローラを作成する必要がありますか?

いいえ、通常は新しいリソース用に新しいコントローラーを作成します。この場合、異なる方法で表示されているのは同じリソース、つまり TimeLog です。これにより、既存のコントローラーに新しいビューと対応する新しいメソッドが保証されます。繰り返しますが、時間ログのさまざまなビューをレンダリングする time_logs というコントローラーがあると想定しています。

そして、データを変更したり、別のデータベースに保存してそこからプルしたりすることなく、これを行う最善の方法は何ですか?

Enumerable#reduce メソッドを使用します。1つの可能な実装は-

def aggregate(time_logs)
  hsh = {}
  time_logs.reduce do |hsh, log|
    if hsh[log.date]
      hsh[log.date].something += log.something
    else
      hsh[log.date] = log
    end
  end
end

ただし、これは O(n) であることに注意してください。データベースから大量のログを取得しない限り、これで問題ありません。それ以外の場合は、このデータを前処理し、集約されたログをデータベースに保持し、必要に応じてプルすることをお勧めします。

お役に立てれば!

于 2013-08-21T06:00:36.673 に答える
0

フィールドgroupでこれに使用しますdate

このリンクが役立つ場合があります

于 2013-08-21T06:12:19.310 に答える