我有一堆有日期的日志对象。在视图中,我通过
显示它们<% @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
我会在模型,控制器,视图中执行此操作吗?我需要制作一个新的控制器吗?什么是最好的方法,无需更改数据或将其保存在另一个数据库中,并从中拉出来。
答案 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)