2011-12-01 51 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] }