【问题标题】:Group by ruby on rails按 ruby​​ on rails 分组
【发布时间】:2018-03-27 12:32:00
【问题描述】:

我需要根据 created_at 列按年和月对用户进行分组,

User.all.group_by{ |q| [q.created_at.year, q.created_at.month]}, 我在哪里用键 [year,month] 得到哈希,有没有办法对结果像

的记录进行分组
{ 
  year1 =>{ month1 =>[array of records], month2=>[array]}, 
  year2 =>{ month1 =>[array of records], month2=>[array]}
}

【问题讨论】:

标签: ruby-on-rails group-by


【解决方案1】:

尝试以下方法:

User.all
  .group_by { |user| user.created_at.year }
  .transform_values { |users| users.group_by { |user| user.created_at.month } }

【讨论】:

  • 有什么方法可以获取分组记录的计数
  • 年数? :size 方法怎么样?
  • 当月收集计数
  • 这个怎么样:group_by { |user| user.created_at.year }.transform_values(&:size)
【解决方案2】:

你可以通过

result = {}
User.all.each do |user|
   result[user.created_at.year] = {} if !result[user.created_at.year].present?
   result[user.created_at.year][user.create_at.month] = []  if !result[user.created_at.year][user.create_at.month].present?
   result[user.created_at.year][user.create_at.month].push(user.attributes)
end

【讨论】:

    【解决方案3】:

    有很多方法可以做到这一点。尽管建议的副本确实提出了解决方案,但还有其他方法可以实现它。其中一个正在使用下面的代码(它是对第一个答案之一的重构)。

    {}.tap do |hash|
      User.all.find_each do |user|
        year = user.created_at.year
        month = user.created_at.month
    
        hash[year] ||= {}
        hash[year][month] ||= []
        hash[year][month] << user
      end
    end
    

    此代码的好处在于您不会将所有用户记录加载到内存中(如果您有 100 万条用户记录则很糟糕),因为它使用 find_each,默认情况下,它会按 1000 个用户获取用户。

    与上面建议的副本中接受的答案不同,它也只检查每个项目一次。

    总的来说,有很多方法可以解决您在 ruby​​ 中遇到的问题。由您来发现您认为是干净代码的内容。但请确保您决定使用的是有效的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-06
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      相关资源
      最近更新 更多