Что ж, из вашего вопроса я выводу, что вы действительно хотели сгруппировать результаты по значению :accepts
и объединить оба набора результатов обратно в один массив.Мое решение этого было бы:
array.select {|where| where[:accepts] } | array.reject {|where| where[:accepts] }
# => [{:accepts=>true, :id=>3},
# {:accepts=>true, :id=>5},
# {:accepts=>false, :id=>1},
# {:accepts=>false, :id=>2},
# {:accepts=>false, :id=>4}]
Это будет поддерживать первоначальный порядок без каких-либо сортировок на клавише :id
.Это означает, что вам не понадобится вспомогательный ключ для сохранения порядка, и вы можете сохранить порядок для результата независимо от передаваемых данных.
Это также может быть полезно (и, возможно, именно то, что вам нужно для дальнейших оценок):
array.group_by {|where| where[:accepts] }
# => {false=>[{:accepts=>false, :id=>1},
# {:accepts=>false, :id=>2},
# {:accepts=>false, :id=>4}],
# true=>[{:accepts=>true, :id=>3},
# {:accepts=>true, :id=>5}]}
Опять же, искусственные сортировки не требуются ... group_by
является новым в 1.8.7.
PS: Если вам не нужен первый фрагмент кодаудалите дубликаты из вашего массива, замените оператор bar на оператор плюс."|"объединяет два набора в соответствии с теорией наборов (объединение), в то время как "+" объединяет два набора (на самом деле это не набор, а простой массив).