Группировка объектов ActiveRecord в стиле Facebook - PullRequest
3 голосов
/ 09 декабря 2011

У вас есть поток активности, похожий на стену Facebook, с несколькими типами записей (статусы, обновления, объявления и т. Д.), Которые передаются в них.Вы хотите сгруппировать похожие типы записей с разными CSS.

Группировка может быть по владельцу объекта (т.е. группировать объекты, принадлежащие «Джону», даже если они не все последовательные, потому что у «Джона» было 5из последних 7 сообщений), или они могут быть по дате (т. е. группировать последние 7 записей, поскольку все они поступили в течение 1 минуты).

Лучший способ узнать, как это сделать, - проанализировать возвращенный списокобъектов, как мы загружаем их в представлении, но это кажется уродливым.Есть ли более элегантное решение?Что-то более похожее на гем has_activity, но это может сделать больше, чем просто группировать по определенному времени?

Нужны больше примеры и концепции, чем решение, но решение тоже хорошо.

Ответы [ 3 ]

1 голос
/ 09 декабря 2011

Если вы выполняете синтаксический анализ в помощнике, это не будет ужасно:)

0 голосов
/ 12 декабря 2011

Желание было сделать это без гигантского, явного метода и воспользоваться преимуществами методов функционального программирования. Мэтт Юэлл прислал мне простой способ выполнить группировку элементов, поступивших в течение одной минуты, с помощью инъекции.

def group?(current, last)
  current.created_at - last.created_at < 1.minute
end

recent_statuses.inject([]) { |results, status|
  next results << [status] if results.empty? # Can't compare first item.
  results << group?(status, results.last.last) ? stat : [stat]
}

Это приведет к массиву сообщений о состоянии и массивам сообщений о состояниинапример,

[<#Status>, <#Status>, [<#Status>, <#Status>], <#Status>, [#<Status>, <#Status>], <#Status>]

И позволит вам проанализировать этот список с помощью чего-то вроде:

results.each do |result|
  if result.class == Status
    # format a single entry
  else result.class == Array
    # Enter the grouped formatting
  end
end

Это, конечно, можно расширить многими способами, включая помещение нескольких логических групп в группу? ().Концептуально это то, что я искал.

0 голосов
/ 10 декабря 2011

Я не совсем понимаю, каковы ваши входы и выходы (я простой пользователь Facebook).

Я предполагаю, что у вас есть список элементов в массиве. Каждый предмет имеет своего рода тип.

  1. Можете ли вы поместить имя для типа в классе CSS блока для каждого элемента? Позвольте браузеру разобраться с этим через некоторый класс в списке - контейнер («только для владельцев»).

  2. Использовать Enumerable # group_by, http://api.rubyonrails.org/classes/Enumerable.html#method-i-group_by

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