Ruby on rails Ruby/Rails-如何在数组中聚合查询结果?

Ruby on rails Ruby/Rails-如何在数组中聚合查询结果?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我有一个大的数据集,我想为用户清理。数据库中的数据集如下所示: ID | project_id | thread_id | action_type |description 1 | 10 | 30 | comment | yada yada yada yada yada 1 | 10 | 30 | comment | xxx 1 | 10 | 30 | comment | ya

我有一个大的数据集,我想为用户清理。数据库中的数据集如下所示:

ID | project_id | thread_id | action_type |description
 1 | 10         | 30        |  comment    | yada yada yada yada yada
 1 | 10         | 30        |  comment    | xxx
 1 | 10         | 30        |  comment    | yada 313133
 1 | 10         | 33        |  comment    | fdsdfsdfsdfsdfs
 1 | 10         | 33        |  comment    | yada yada yada yada yada
 1 | 10         |           | attachment  | fddgaasddsadasdsadsa
 1 | 10         |           | attachment  | xcvcvxcvxcvxxcvcvxxcv
现在,在我看来,当我以与上面相同的顺序输出上面的内容时,问题是它非常重复。例如,对于项目id 10和线程id 30,您可以看到:

10 - 30 - yada yada yada yada yada
10 - 30 - xxxxx
10 - 30 - yada yada yada yada yada
我想学习的是如何在ruby中创建一个数组,并在项目id和线程id下创建描述,因此输出是:

10 - 30
 - yada yada yada yada yada
 - xxxxx
 - yada yada yada yada yada
关于从哪里开始有什么建议吗?这个要求对我来说是新的,所以我非常感谢您对解决这个问题的最佳方法的想法。希望这可以用ruby而不是sql来完成,因为活动提要的事件类型和复杂性可能会增加

谢谢

在Ruby或SQL中使用
groupby
。在Ruby中:

sets = DataSet.all.group_by{ |data| [data.project_id, "-", data.thread_id].join(" ") }
然后你会得到这样的散列:

{ "10 - 30" => [#DataSet1, #DataSet2 ...], "10 - 33" => [#DataSet7, #DataSet11 ...]
您可以在视图中对其进行分析:

<% sets.each do |range, datas| %>
  <p><%= range %>:</p>
  <% datas.each do |data| %>
    <p><%= data.description %></p>
  <% end %>
<% end %>

:

每个_的UPD与_索引

<% sets.each_with_index do |datas, index| %>
  <p><%= datas[0] %>:</p>
  <% datas[1].each do |data| %>
    <p><%= data.description %></p>
    # some stuff with *last*
    <%= "This is the last one" if data == datas[1].last %> 
  <% end %>
<% end %>

:

#一些最后的东西*
对于使用
枚举器的
分组方法,我遵循一个简单的指导原则。
-所操作的数据集应较小且固定,并保证随时间保持不变

例如:

在我看来,您的活动提要表可以随着时间的推移快速增长。
活动.all
将所有活动加载到内存中。执行此调用会导致内存和网络开销过大。在没有out条件和分页的情况下执行
all
调用从来都不是一个好主意。如果当前正在对结果集分页,则当结果集跨越多个页面时,当前解决方案将不起作用。您必须使用
order
子句来获得正确的结果集

这就是我要做的:

在控制器中:

# order by ensures that ordering happens at the DB
# pagination and conditions ensures that data set is small
activities = Activity.paginate(:order => "project_id, thread_id", :page => #pn)
@activity_groups = activities.group_by{|a| "#{a.project_id} - #{a.thread_id}"}

现在,您可以按照
fl00r
的建议,在视图中使用
@activity\u group

对于SQL方法,请使用GROUPBY。对于Ruby方法,使用可枚举的groupby。检查文档。这些数据采用什么形式?是ActiveRecord对象还是JSON对象还是其他什么?@Pan,这个数据是一个ActiveRecord对象,就像@activityThis一样,这肯定是我见过rails做过的最令人印象深刻的事情。我最终需要一个索引,所以我将它改为
# order by ensures that ordering happens at the DB
# pagination and conditions ensures that data set is small
activities = Activity.paginate(:order => "project_id, thread_id", :page => #pn)
@activity_groups = activities.group_by{|a| "#{a.project_id} - #{a.thread_id}"}