首页 > 解决方案 > 如何合并不同的键?

问题描述

我有两个模型类

class Book
  # attributes
  # title
  # status
  # author_id
  belongs_to :author
  enum status: %w[pending published progress]
 end

class Author
  # attributes
  has_many :books
end

我有一个返回书籍列表的活动记录

名单

[<#Book><#Book><#Book>]

我使用此功能对它们进行分组

def group_by_gender_and_status
   books.group_by { |book| book.author.gender }
      .transform_values { |books| books.group_by(&:status).transform_values(&:count) }
end

结果是

{  
    "female"=>{"progress"=>2, "pending"=>1, "published"=>2}, 
     "male"=>{"published"=>3, "pending"=>4, "progress"=>4}
} 

如何合并progresspending命名密钥pending?所以看起来像这样

{  
    "female"=>{"pending"=>3, "published"=>2 }, 
     "male"=>{"pending"=>8, "published"=>3,  }
} 

出于某种原因,我更喜欢使用该group_by方法而不是SQL。group谢谢

标签: ruby-on-railsruby

解决方案


def group_by_gender_and_status
   books.group_by { |book| book.author.gender }.
   transform_values do |books| 
       books.group_by { |book| book.status == 'progress' ?  'pending' : book.status }.
           transform_values(&:count) 
   end
end 

推荐阅读