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

时间:2011-02-11 23:02:43

标签: 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    | yada 313133
 1 | 10         | 33        |  comment    | fdsdfsdfsdfsdfs
 1 | 10         | 33        |  comment    | yada yada yada yada yada
 1 | 10         |           | attachment  | fddgaasddsadasdsadsa
 1 | 10         |           | attachment  | xcvcvxcvxcvxxcvcvxxcv

现在,当我在我的视图中输出上面的内容与上面的顺序完全相同时,问题是它是非常重复的。例如,对于project_id 10&你看到thread_id 30:

10 - 30 - yada yada yada yada yada
10 - 30 - xxxxx
10 - 30 - yada yada yada yada yada

我想学习如何在ruby中做什么,是一些如何在project_id和thread_id下创建数组和聚合描述,所以输出是:

10 - 30
 - yada yada yada yada yada
 - xxxxx
 - yada yada yada yada yada

有关从何处入手的建议?这个要求对我来说是新的,所以我很感激你对你认为解决这个问题的最佳方法的想法。希望这可以在ruby而不是sql中完成,因为活动源可能会在事件类型和复杂。

由于

2 个答案:

答案 0 :(得分:10)

在Ruby中使用group_by http://apidock.com/rails/Enumerable/group_by或在SQL中使用。在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 for each_with_index

<% 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 %>

答案 1 :(得分:0)

我遵循使用group_by的{​​{1}}方法的简单指南。   - 正在操作的数据集应该很小且固定,并保证随时间保持不变。

例如:

Enumerator

在我看来,您的活动供稿表会随着时间的推移而快速增长。 Fixed data-set: Zip codes, city names Dynamic but small data-set: User's hobbies Dynamic but paginated data-set: First page of latest orders. 将所有活动加载到内存中。执行此调用会导致过多的内存和网络成本。在没有条件和分页的情况下执行Activity.all调用绝不是一个好主意。如果您当前正在对结果集进行分页,则当结果集跨越多个页面时,当前解决方案将不起作用。您必须使用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}"} 的建议在视图中使用@activity_groups