我需要按年份和月份基于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]}
}
答案 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中遇到的问题。由您来发现您认为干净的代码。但请确保您决定使用的是有效的。