Ruby on rails 以类似Facebook墙的方式对ActiveRecord对象进行分组

Ruby on rails 以类似Facebook墙的方式对ActiveRecord对象进行分组,ruby-on-rails,Ruby On Rails,你有一个活动流,类似于Facebook的墙,有多种类型的记录(状态、更新、公告等)流入其中。您希望使用不同的CSS对类似类型的记录进行分组 分组可以按对象所有者进行(即,对“John”拥有的对象进行分组,即使这些对象不全是Sequential,因为“John”在最后7篇文章中有5篇),也可以按日期进行分组(即,对最后7条记录进行分组,因为它们都在1分钟内出现) 我知道的最好的方法是在视图中加载返回的对象列表时解析它们,但这看起来很难看。有更优雅的解决方案吗?一些更像has_活动宝石的东西,但它能

你有一个活动流,类似于Facebook的墙,有多种类型的记录(状态、更新、公告等)流入其中。您希望使用不同的CSS对类似类型的记录进行分组

分组可以按对象所有者进行(即,对“John”拥有的对象进行分组,即使这些对象不全是Sequential,因为“John”在最后7篇文章中有5篇),也可以按日期进行分组(即,对最后7条记录进行分组,因为它们都在1分钟内出现)

我知道的最好的方法是在视图中加载返回的对象列表时解析它们,但这看起来很难看。有更优雅的解决方案吗?一些更像has_活动宝石的东西,但它能做的不仅仅是按特定时间分组


与解决方案相比,更多的是寻找示例和概念,但解决方案也很好。

如果你在助手中进行解析,它不会很难看:)

我不太明白你的输入和输出是什么(我只是一个简单的Facebook用户)

我假设您有一个数组中的项目列表。每个项目都有某种类型

  • 您可以为每个项目在块的CSS类中放置类型的名称吗?让浏览器通过列表容器(“仅限所有者”)上的某个类对其进行排序

  • 使用可枚举的#分组依据


  • 我们的愿望是在不使用大型显式方法的情况下实现这一点,并利用函数式编程方法。给我发送了一个简单的方法,可以使用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