2011-12-09 52 views
3

您有一個活動流,類似於Facebook的Wall,有多種類型的記錄(狀態,更新,公告等)流入它們。你想用不同的CSS對相似類型的記錄進行分組。以類似Facebook的方式對ActiveRecord對象進行分組

分組可以由對象所有者(即,即使它們不是全部序列,因爲「John」擁有最後7個帖子中的5個),或者它們可以按日期(即組最後7條記錄,因爲它們都在1分鐘內進來)。

我知道如何做到這一點的最好方法是解析返回的對象列表,因爲我們將它們加載到視圖中,但這看起來很醜。有沒有更優雅的解決方案?更像是has_activity的寶石,但它可以做的不僅僅是按特定時間分組?

尋找更多的例子和概念,而不是解決方案,但一個解決方案也很好。

回答

0

的願望是做,而無需一個巨大的,明確的方法,並利用函數式編程方法。 Matt Youell給我發送了一個簡單的方法來完成使用注入在一分鐘內到達的分組項目。

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 

這當然,可以在許多方面,包括將多個邏輯分組到組擴展(?)。從概念上講,這正是我所期待的。

1

如果你在一個幫手做解析,它不會是醜陋:)

+0

的確如此。我打算在控制器中做,但保持它不在那裏會是最好的。不過,這更多的是解析,收集和優雅組織信息的方法問題。我正在尋找最佳做法,但可能沒有。我想我現在只會嘲笑它。 – JohnMetta

0

我不太明白你的輸入和輸出是(我只是一個簡單的Facebook的用戶)。

我假設你有一個數組中的項目列表。每個項目都有某種類型。

  1. 您可以在每個項目的塊的CSS類中放置一個類型的名稱嗎?讓瀏覽器通過列表中的某個類 - 容器(「所有者」)對其進行排序。

  2. 使用可枚舉#GROUP_BY,http://api.rubyonrails.org/classes/Enumerable.html#method-i-group_by

相關問題