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 }

你只需要告诉 sort 如何对对象进行排序

一个建议,而不是

@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. 但是,如果 eachphoto属于 anevent那么您可以删除photofrom activity feed

然后每个对象都可以activity feed并且可以很容易地基于 排序created_at。此外,您不需要手动提取照片。

希望这会有所帮助!

于 2012-06-15T09:48:09.627 回答