0

我有一堆有日期的日志对象。在视图中,我正在向他们展示

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

如果我想做到这一点,当多个仅在同一日期发生时显示为一个 IE:

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

用于group此与date字段

此链接可能会有所帮助

于 2013-08-21T06:12:19.310 回答
0

根据您使用的 ORM,您需要使用该group_by功能。

活动记录:

Logs.select("date(created_at), sum(something) as something, sum(something_else) as something_else").group("date(created_at)")

更多信息在这里

Mongoid 3.xx:

Logs.collection.group(
  :cond => {},
  :key => 'created_at',
  :initial => { something_count: 0, something_else_count: 0 },
  :reduce => "function(x, y) {
    y.something_count      += x.something_count;
    y.something_else_count += x.something_else_count;
  }"
)

更多信息在这里

于 2013-08-21T05:55:55.670 回答
0

最好了解有关您的应用程序的更多详细信息,例如哪个控制器正在呈现此视图,模型对象的 time_logs 集合等。但是,我将做出一些简化的假设并尝试回答您的问题。

我会在模型、控制器、视图中这样做吗?

这种聚合逻辑最好存在于模型中。我猜你的应用程序中有一个名为 TimeLog 的模型。

我必须制作一个新的控制器吗?

不,通常您会为新资源创建一个新控制器。在这种情况下,以不同方式显示的是同一资源,即 TimeLog。这将保证现有控制器中的新视图和相应的新方法。同样,我假设您有一个名为 time_logs 的控制器,它为时间日志呈现不同的视图。

在不必更改数据或将其保存在另一个数据库中并从中提取数据的情况下,最好的方法是什么?

使用 Enumerable#reduce 方法。一种可能的实现可能是 -

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