2011-12-01 37 views
1

我的代码如下所示:的Rails通过ID组使用了哈希值的字符串

hash = MyModel.count(:group => 'id', :conditions => 'bla = "bla"') 

返回Hash有是字符串键。我希望他们成为整数。我知道可以使用类似于map构造的东西手动转换Hash

编辑:

感谢您的回复。已经意识到这是一个JSON转换过程,将ID转变为字符串,而轨道实际上使用了Fixnum,正如人们所期望的那样。

+0

我认为所有的ActiveRecord哈希存储为字符串和实例化时,会自动转换为各自的类型。 – Sean

回答

1

当我使用你的代码时,我得到整数键(rails 3.07),什么是列的id类型?

如果你想要做手工:

new_hash = hash.inject({}){|h,a| h[a.first.to_i] = a.last; h} 
+0

是的,我最终这样做,似乎是一个耻辱,Rails返回整数id作为一个字符串。编辑:轨道2.3.2。 – Finbarr

2
hash = MyModel.count(group: 'id', conditions: 'bla = "bla"') 

应该有Fixnum键在默认情况下,因为ID是Fixnum对象的实例。

会发生什么事是,ActiveRecord的总是取结果作为字符串,然后Rails的需要将它们转换为根据数据库列的类型其它数据类型的护理(我们说他们是类型转换)。

所以这可能是一个Rails的bug或'id'列没有设置为整数(这将是令人惊讶的)。

如果你不能修复它,手动将其转换:

hash.each_with_object({}) do |(key, value), hash| 
    hash[key.to_i] = value 
end 
+0

感谢您花时间充实我的答案:) – Sean

+0

哦,只是时间来抓住我的Rails 3方式,并打开它第131页lol – Damien

+0

酷 - 以前没有见过each_with_object,出来一点点比注入({}) – klochner

0
new_hash = Hash[hash.map { |k, v| [k.to_i, v] }