在一天中显示多个日志作为一个

时间:2013-08-21 05:40:04

标签: ruby-on-rails ruby ruby-on-rails-3

我有一堆有日期的日志对象。在视图中,我通过

显示它们
<% @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

我会在模型,控制器,视图中执行此操作吗?我需要制作一个新的控制器吗?什么是最好的方法,无需更改数据或将其保存在另一个数据库中,并从中拉出来。

3 个答案:

答案 0 :(得分:0)

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

<强> ActiveRecord的:

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

更多信息here

Mongoid 3.x.x:

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;
  }"
)

更多信息here

答案 1 :(得分:0)

这将会是很好的了解你的应用程序更多的细节,如该控制器呈现这个观点,是time_logs模型对象的集合,等等。但是,我会做一些简化的假设,并尝试回答你的问题。< / p>

我会在模型,控制器,视图中执行此操作吗?

这种聚合逻辑最好位于模型中。我猜你的应用程序中有一个名为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)。只要你不从数据库中提取大量日志就可以了。否则,最好预先处理这些数据并将聚合日志保存在数据库中,并在需要时将其拉出来。

希望这有帮助!

答案 2 :(得分:0)

group字段

使用date

This link may help