【问题标题】:how to chop a DataMapper Collection into one Collection per day?如何每天将 DataMapper 集合切成一个集合?
【发布时间】:2012-11-18 20:55:04
【问题描述】:

我有一个 DataMapper::Collection 对象。它的每个条目都有一个created_at 属性。我想将条目呈现到 html 表格中,每天一张(为此我使用 Sinatra)。

将所有内容渲染到一张表中是没有问题的,但我没有让它每天都这样做。我想到了一组 DataMapper::Collection 对象,我将对其进行迭代并完成工作。但我不知道如何构建这样一个数组:/

有人知道如何解决我的问题,或者有人有不同/更好的方法吗? 提前致谢!

【问题讨论】:

  • 我知道的老问题,但一种选择是使用Model.all.group_by &:created_at,它将是一个哈希值,其中日期作为键,数组作为值。
  • 这太棒了!抱歉这个可能很愚蠢的问题,但是&符号在这里做什么?
  • 这里是Symbol#to_proc
  • 好的,谢谢!您还有将记录按两列分组的解决方案吗?
  • 当然:一种方法是Model.all.group_by {|m| [m.something, m.something_else] },然后它将是一个数组,其中“键”和“值”都是数组。

标签: ruby database sinatra datamapper ruby-datamapper


【解决方案1】:

你有(至少)两个选择。 第一是让数据库为您完成工作。我不了解数据映射器,但大多数数据库映射器(!)都具有使用 SQL 的 GROUP BY 进行分组的功能。在这种情况下,您必须使用数据库函数从时间戳中获取日期,然后对其进行分组。这是最快的选择,如果您和未来的维护人员熟悉关系数据库,这可能也是最好的选择。

second 选项用于映射到您的代码中。我现在想不出一个优雅的 Ruby 东西,但你至少可以做到:

mapped_result = Hash.new [] # initiates each new entry with empty array
mapper_collection.each do |one_record|
  mapped_result[one_record.created_at.strftime '%Y-%m-%d'] << one_record
end

然后你就可以录制一天了

mapped_result['2012-11-19']

【讨论】:

    猜你喜欢
    • 2017-04-20
    • 2011-06-21
    • 2012-01-01
    • 2021-05-14
    • 2015-12-23
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    相关资源
    最近更新 更多