在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
这是最好的方法,还是有更好的方法?
答案 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
轻松排序。
此外,您无需手动提取照片。
希望这会有所帮助!