由ruby在轨道上分组

时间:2018-03-27 12:32:01

标签: ruby-on-rails group-by

我需要按年份和月份基于created_at列对用户进行分组,

User.all.group_by{ |q| [q.created_at.year, q.created_at.month]},  我正在使用密钥[年,月]获取哈希值,是否有任何方法可以将记录分组,如

{ 
  year1 =>{ month1 =>[array of records], month2=>[array]}, 
  year2 =>{ month1 =>[array of records], month2=>[array]}
}

3 个答案:

答案 0 :(得分:4)

尝试以下方法:

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

答案 1 :(得分:1)

你可以通过

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

答案 2 :(得分:1)

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

{}.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

这段代码的好处在于你没有将所有用户记录加载到内存中(如果有的话,那就是坏的,比方说,1M用户记录),因为它使用了find_each,默认情况下,用户获取1000。

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

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