首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby / Rails -如何在数组中聚合查询结果?

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

Stack Overflow用户
提问于 2011-02-12 07:02:43
回答 2查看 2.9K关注 0票数 7

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

代码语言:javascript
复制
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,您将看到:

代码语言:javascript
复制
10 - 30 - yada yada yada yada yada
10 - 30 - xxxxx
10 - 30 - yada yada yada yada yada

我想要学习的是如何在ruby中创建一个数组,并在project_id和thread_id下进行聚合描述,因此输出结果是:

代码语言:javascript
复制
10 - 30
 - yada yada yada yada yada
 - xxxxx
 - yada yada yada yada yada

对于从哪里开始有什么建议吗?这个需求对我来说是新的,所以我希望你能想出解决这个is.Hopefully的最好的方法这可以用ruby而不是sql,因为活动提要的事件类型和复杂性可能会增加。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-12 07:23:18

在Ruby或SQL中使用group_by http://apidock.com/rails/Enumerable/group_by。在Ruby中:

代码语言:javascript
复制
sets = DataSet.all.group_by{ |data| [data.project_id, "-", data.thread_id].join(" ") }

然后你就会得到这样的哈希:

代码语言:javascript
复制
{ "10 - 30" => [#DataSet1, #DataSet2 ...], "10 - 33" => [#DataSet7, #DataSet11 ...]

你可以在视图中解析它:

代码语言:javascript
复制
<% sets.each do |range, datas| %>
  <p><%= range %>:</p>
  <% datas.each do |data| %>
    <p><%= data.description %></p>
  <% end %>
<% end %>

针对each_with_index的更新

代码语言:javascript
复制
<% 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 %>
票数 11
EN

Stack Overflow用户

发布于 2011-03-27 02:38:39

使用Enumeratorgroup_by方法时,我遵循一个简单的指导原则。-被操作的数据集应该是小的和固定的,并保证随时间保持不变。

例如:

代码语言:javascript
复制
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子句才能获得正确的结果集。

这就是我要做的:

在您的控制器中:

代码语言:javascript
复制
# 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_groups

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4974933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档