Ruby on rails 以类似Facebook墙的方式对ActiveRecord对象进行分组
你有一个活动流,类似于Facebook的墙,有多种类型的记录(状态、更新、公告等)流入其中。您希望使用不同的CSS对类似类型的记录进行分组 分组可以按对象所有者进行(即,对“John”拥有的对象进行分组,即使这些对象不全是Sequential,因为“John”在最后7篇文章中有5篇),也可以按日期进行分组(即,对最后7条记录进行分组,因为它们都在1分钟内出现) 我知道的最好的方法是在视图中加载返回的对象列表时解析它们,但这看起来很难看。有更优雅的解决方案吗?一些更像has_活动宝石的东西,但它能做的不仅仅是按特定时间分组Ruby on rails 以类似Facebook墙的方式对ActiveRecord对象进行分组,ruby-on-rails,Ruby On Rails,你有一个活动流,类似于Facebook的墙,有多种类型的记录(状态、更新、公告等)流入其中。您希望使用不同的CSS对类似类型的记录进行分组 分组可以按对象所有者进行(即,对“John”拥有的对象进行分组,即使这些对象不全是Sequential,因为“John”在最后7篇文章中有5篇),也可以按日期进行分组(即,对最后7条记录进行分组,因为它们都在1分钟内出现) 我知道的最好的方法是在视图中加载返回的对象列表时解析它们,但这看起来很难看。有更优雅的解决方案吗?一些更像has_活动宝石的东西,但它能
与解决方案相比,更多的是寻找示例和概念,但解决方案也很好。如果你在助手中进行解析,它不会很难看:)我不太明白你的输入和输出是什么(我只是一个简单的Facebook用户) 我假设您有一个数组中的项目列表。每个项目都有某种类型
我们的愿望是在不使用大型显式方法的情况下实现这一点,并利用函数式编程方法。给我发送了一个简单的方法,可以使用inject对一分钟内到达的项目进行分组
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