如何按时间顺序对合并的数组和哈希进行排序?

时间:2012-06-07 16:32:44

标签: ruby-on-rails

在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

这是最好的方法,还是有更好的方法?

2 个答案:

答案 0 :(得分:5)

您可以合并数组和哈希,然后对其进行排序

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

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

一个建议,而不是

@user.activity_feeds.sort_by(&:created_at)

DO

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

应该更快,因为您已经从数据库中获取了活动(如果activity_feeds是关系)

答案 1 :(得分:1)

您需要对原始设计进行一些修改。

我建议将event添加到activity feed,同时您还需要将原始photo保留到activity feed

因为,通过将照片作为活动Feed,您可以在照片未与任何a single photo相关联时在您的活动信息流上显示event。但是,如果每个photo属于event,那么您可以从photo中移除activity feed

然后每个对象都为activity feed,并且可以根据created_at轻松排序。 此外,您无需手动提取照片。

希望这会有所帮助!