В этом случае, вероятно, вы могли бы просто сделать
@posts.group_by(&:author_id)
В более общем смысле, вы можете передать блок group_by, поэтому, если вам нужно сгруппировать по некоторой произвольной логике:
@posts.group_by { |post|
... some code returning a value to group this post by ...
}
Как и следует надеяться, в прошлый раз, когда я смотрел, реализация group_by сохраняет относительный порядок данных, передаваемых в него, что может быть полезно запомнить, поскольку позволяет сортировать данные в «плоском» списке сообщений, а затем, когда вы группируете их, порядок сохраняется внутри группировок, а не сортируется по вложенным данным, выводимым group_by.