如何根据下一个值对ruby对象进行分组

时间:2014-02-25 20:06:05

标签: ruby-on-rails ruby loops

好的,我有这个对象数组

pry(main)> @something.objects
=> [#<Object id: 2, position: 1, some_type: "Header", entryable_id: 6>,
=> [#<Object id: 3, position: 2, some_type: "Content", entryable_id: 32>,
=> [#<Object id: 4, position: 3, some_type: "Content", entryable_id: 11>,
=> [#<Object id: 6, position: 4, some_type: "Header", entryable_id: 15>,
=> [#<Object id: 7, position: 5, some_type: "Content", entryable_id: 41>,
=> [#<Object id: 8, position: 6, some_type: "Header", entryable_id: 109>,

我想要的是与下一个内容分组的标题,如

[{
  header: #<Object id: 2, position: 1, some_type: "Header", entryable_id: 6, 
  content: [#<Object id: 3, position: 2, some_type: "Content", entryable_id: 32>, #<Object   id: 4, position: 3, some_type: "Content", entryable_id: 11>]}, 
  header: #<Object id: 6, position: 4, some_type: "Header", entryable_id: 15>, 
  content: [#<Object id: 7, position: 5, some_type: "Content", entryable_id: 41>],
  content: #<Object id: 8, position: 6, some_type: "Header", entryable_id: 109>
]

所以基本上这些对象都有一个位置,我想用下一个“内容”对所有Header进行分组,直到另一个标题出现...我只想循环对象并创建一个哈希数组但是我想知道是否有最佳的做法,可能是使用数据库或其他方法

1 个答案:

答案 0 :(得分:7)

slice_before正是您要找的。

@something.slice_before {|e| e.some_type == "Header"}.flat_map { |h, *c| {:header => h, :content => c} }