2011-12-09 4 views
3

Facebookの壁に似たアクティビティストリームがあり、複数の種類のレコード(ステータス、更新、アナウンスなど)がストリーミングされています。同じ種類のレコードを異なるCSSでグループ化したいとします。Facebook壁のような方法でActiveRecordオブジェクトをグループ化する

グループ化は、オブジェクトの所有者(すなわち、「John」が最後の7つの投稿のうち5つを持っていたため、「John」によって所有されているオブジェクトをグループ化することもできます。彼らはすべて1分以内に来たので、最後の7レコードをグループ化する)。

私がこれを行う方法を知っている最良の方法は、オブジェクトの返されたリストを解析してビューにロードすることですが、それは醜いようです。より洗練されたソリューションはありますか?何かhas_activityの宝石のようなものですが、それは特定の時間だけをグループ化する以上のことができますか?

解決策よりも多くの例と概念を見ていますが、解決策もあります。

答えて

0

願望http://api.rubyonrails.org/classes/Enumerable.html#method-i-group_byは巨大な、明示的な方法なしでこれを行うには、と関数型プログラミング手法を活用することでした。 Matt Youellは、注射を使用して1分以内に到着したアイテムをグループ化する簡単な方法を私に送った。

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は、

関連する問題