В моем проекте я хотел бы выбрать записи из моей базы данных, а затем сгруппировать их по тем, которые произошли в то же время, что и последняя запись в определенном временном диапазоне.
Например, с диапазоном времени 1 час. Если пользователь создал 3 поста с 16:30 до 17:15, 2 поста с 13:15 до 13:30 и 1 пост в 10:00, я хотел бы создать следующую структуру:
user.posts.find(:all).group_by do |post|
# (posts have a created_at column containing both a date and time)
# Algorithm here
end
Результат:
[
[Tue March 31 5:15pm, [post6,post5,post4]]
[Tue March 31 1:30pm, [post3,post2]]
[Tue March 31 10:00am, [post1]]
]
Есть мысли по поводу лучшего алгоритма для этого? Псевдокод тоже подойдет, если вы не знаете Ruby.
Edit:
Спасибо, Джоэл. Вот код, который я использовал (каналы вместо сообщений):
def aggregate(feeds, timeLimit)
return [] if feeds.blank?
result = []
bin = []
feeds = feeds.sort_by { |f| -f.created_at.to_i }
bin_time = feeds.first.created_at
feeds.each do |feed|
if (bin_time - feed.created_at) < timeLimit
bin << feed
else
result << [bin_time, bin]
bin_time = feed.created_at
bin = [feed]
end
end
result << [bin_time, bin]
result
end