Так что это оказалось довольно легко.
Story.find_each.group_by do |story|
[story.user_id, story.created_at.beginning_of_hour]
end
тогда вы можете отобразить результаты и сделать что угодно. Я проверил, есть ли в группе более одного объекта, и, если это так, создал новую историю, вставил информацию обо всех историях, которые я хотел сгруппировать, а затем добавил ее в массив историй. Я никогда не сохраняю новую историю, поэтому я не получаю кучу странных сохраненных историй.
Если у кого-то есть лучший способ сделать это, я открыт для предложений.
Вот весь метод:
def self.smart_feed
feed = []
self.find_each(batch_size: 10).group_by do |story|
[story.user_id, story.created_at.beginning_of_hour]
end.map do |stories|
if stories.second.count > 1
temp_story = self.new()
stories.second.map do |story|
if story.ratings.any?
temp_story.ratings.append(story.ratings)
elsif story.flights.any?
temp_story.flights.append(story.flights)
end
temp_story.description = "Added #{temp_story.ratings.size} new ratings and #{temp_story.flights.size} new flights"
temp_story.user_id = story.user_id
end
feed.append(temp_story)
else
feed.append(stories.second.first)
end
end
return feed.reverse
end