4

Rails 3.2 アプリには、ポリモーフィックな ActivtyFeed モデルがあります。

class ActivityFeed
  belongs_to :user
  belongs_to :feedable, polymorphic: true
end

ActivityFeed インデックス ビューでいくつかのアイテムを集約する必要があります。たとえば、写真ごとに個別のアイテムをレンダリングする代わりに、写真を日付またはイベントでグループ化し、「ユーザーがアップロードした x 写真」を表示したいと考えています。

私のコントローラーは次のようになります。

@feed_items = @user.activity_feeds.sort_by(&:created_at)
@feed_array = []
photos = @feed_items.find_all{|f|f.feedable_type.eql?("Photo")}
@feed_items.delete_if{|f|f.feedable_type.eql?("Photo")}
@feed_array << @feed_items
grouped_photos = photos.group_by{|p| p.feedable.event_id}
@feed_array << grouped_photos
@feed_array.flatten!

次に、私が使用しているビューで

if feed_array.class.eql?(Hash)
  render grouped photo partial
elsif feed_array.feedable_type.eql?("Post")
  render single post partial
etc

配列にネストされたハッシュが含まれているため、アイテムを時系列で並べ替えることができません。

[#<ActivityFeed id: 7, user_id: 2, feedable_type: "Post", feedable_id: 3>, {2=>[#<ActivityFeed id 3, user_id: 4, feedable_type: "Photo", feedable_id: 6>]}]

この配列をソートするにはどうすればよいですか?

やってみ@feed_array.sort{|a,b| a.['created_at'] <=> b.['created_at'] }たけど取れたcomparison of ActivityFeed with Hash failed

これが最善のアプローチですか、それとももっと良い方法がありますか?

4

2 に答える 2

5

配列とハッシュをマージしてから並べ替えることができます

merged.sort {|a,b| a.method <=> b.method }

オブジェクトを並べ替える方法を並べ替えるだけです。

代わりに1つの提案

@user.activity_feeds.sort_by(&:created_at)

行う

@user.activity_feeds.order('created_at ASC')

すでにデータベースからアクティビティをソートしているので、これはより高速なはずです(activity_feedsがリレーションの場合)

于 2012-06-07T17:35:19.497 に答える
1

元のデザインを少し変更する必要があります。

私が提案するのは、に追加eventすることです。またactivity feed、オリジナルも維持する必要があります。photoactivity feed

a single photo 写真をアクティビティ フィードとして保持することで、写真が関連付けられていないときにアクティビティ ストリームに表示できるようになるためですevent。ただし、すべてが にphoto属している場合は、からeventを削除できます。photoactivity feed

次に、すべてのオブジェクトはactivity feedに基づいて簡単にソートできますcreated_at。また、手動で写真を抽出する必要はありません。

これが役立つことを願っています!

于 2012-06-15T09:48:09.627 に答える