动态添加到ruby中的现有键值对

时间:2014-12-16 15:35:13

标签: ruby-on-rails ruby hash

好的,因此在Ruby Hashes工作8个月后仍然有点谜。

我从数据库中提取了10条记录,每条记录都有自己的类别字段。许多记录共享相同的类别,因此我希望它们按类别在哈希中分组。

我知道Key的内容总是独一无二的,这就是Hash成为哈希的原因。我正在努力做的是为哈希中的现有密钥添加值。

def self.categorise_events
    hash = {}
    self.limit(10).map do |event|
        if hash.key?(event.event_type) #check if the key already exists
            hash[event.event_type][event] #add the event record to that key
        else
            hash[event.event_type] = event #create the key if it doesn't exist and add the record 
        end
    end
    hash
end 

这更像是我想要实现的目标。我已经有了其他的作品,这些作品已经接近但仍然没有做到。

2 个答案:

答案 0 :(得分:2)

您可以添加现有的哈希,例如

hash[key] = value

但在你的情况下,你的值是一组值,所以它是一个数组

hash[key] = []
hash[key] << value

因此您可以使用

添加到现有组
unless hash.key?(event.event_type)
  hash[event.event_type] = []
end

hash[event.event_type] << event

现在,可以使用documentations上显示的内置方法#group_by来完成此操作。但在您的情况下,因为它使用ActiveRecord,您可以考虑使用#group使用SQL对记录进行分组,并大大提高分组的性能​​

self.limit(10).group(:event_type)

查看文档here

答案 1 :(得分:1)

Key始终是uniq。因此,如果要向键添加值,则该值应为Array。

在这种情况下,您可以使用group_by。尝试

hash = self.limit(10).group_by{|e| e.event_type}

它返回一个哈希,其键是event_type,值是记录数组。