AnA*_*ice 7 ruby ruby-on-rails ruby-on-rails-3
我有一个大型数据集,我想为用户清理.来自DB的数据集如下所示:
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
Run Code Online (Sandbox Code Playgroud)
现在,当我在我的视图中输出上面的内容与上面的顺序完全相同时,问题是它是非常重复的.例如,对于project_id 10&thread_id 30,您会看到:
10 - 30 - yada yada yada yada yada
10 - 30 - xxxxx
10 - 30 - yada yada yada yada yada
Run Code Online (Sandbox Code Playgroud)
我想学习如何做的红宝石,是一些如何创建一个PROJECT_ID和thread_id,则下一个数组,aggreate描述,所以不是输出为:
10 - 30
- yada yada yada yada yada
- xxxxx
- yada yada yada yada yada
Run Code Online (Sandbox Code Playgroud)
关于从哪里开始的任何建议?这个要求对我来说是新的,所以我很感激你对你认为解决这个问题的最佳方法的想法.希望这可以在ruby而不是sql中完成,因为活动源可能会在事件类型和复杂.
谢谢
fl0*_*00r 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(" ") }
Run Code Online (Sandbox Code Playgroud)
然后你就会得到哈希:
{ "10 - 30" => [#DataSet1, #DataSet2 ...], "10 - 33" => [#DataSet7, #DataSet11 ...]
Run Code Online (Sandbox Code Playgroud)
您可以在视图中解析:
<% sets.each do |range, datas| %>
<p><%= range %>:</p>
<% datas.each do |data| %>
<p><%= data.description %></p>
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
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 %>
Run Code Online (Sandbox Code Playgroud)