Групповые результаты созданы в одинаковые временные метки - PullRequest
1 голос
/ 01 апреля 2009

В моем проекте я хотел бы выбрать записи из моей базы данных, а затем сгруппировать их по тем, которые произошли в то же время, что и последняя запись в определенном временном диапазоне.

Например, с диапазоном времени 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

Ответы [ 2 ]

1 голос
/ 01 апреля 2009

Основная концепция довольно проста: накапливать сообщения в ячейки, а затем, когда время выходит за пределы диапазона, запустить новую ячейку. Вот версия Python:

posts = [('post6', 1715), ('post5', 1645), ('post4', 1630)
    , ('post3', 1330), ('post2', 1315), ('post1', 1000)
    ]

rslt = []
bin = []
binTime = 1 << 31
for postData, postTime in posts:
    if (postTime >= binTime - 100):
        bin.append(postData)
    else:
        if bin:
            rslt.append([binTime, bin])
        binTime = postTime
        bin = [postData]

if bin:
    rslt.append([binTime, bin])

print rslt
0 голосов
/ 01 апреля 2009
if post.created_at - group_start > limit
    output current group if non-empty
    set group to current post
    set group_start to post.created_at
else
    add post to current group

затем вне цикла выведите текущую группу, если она не пуста. Отрегулируйте условие if в зависимости от порядка посещений сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...