2011-12-01 4 views
1

내 코드는 다음과 같습니다 해시 키에 대한 문자열을 사용레일 그룹은

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

Hash는 문자열 키가 돌아왔다. 나는 그들이 int가되기를 바란다. map 구조를 사용하여 Hash을 수동으로 변환하는 것이 가능하다는 것을 알고 있습니다.

편집 :

감사합니다. 문자열을 실제 문자열로 바꾸는 json 변환 프로세스가 실제로 Fixnum을 사용한다는 것을 깨달았습니다.

+0

나는 모든 액티브 해시 문자열로 저장됩니다 생각하고 인스턴스화 할 때 자동으로 해당 유형으로 변환됩니다. – Sean

답변

1

정수 키 (레일 3.07)를 사용할 때 ID의 열 유형은 무엇입니까?

수동으로 수행 할 경우

: ID가 Fixnum이라는 인스턴스이기 때문에

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

그래,이 일을 끝내고, 레일스가 정수 ID를 문자열로 반환한다는 것은 수치 스러울 것 같습니다. 편집 : 레일 2.3.2. – Finbarr

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

는 기본적으로 Fixnum 키가 있어야합니다.

ActiveRecord 은 항상 결과를 문자열으로 가져오고, 그 다음 레일스는 데이터베이스 열의 유형에 따라 다른 데이터 유형으로 변환합니다 (유형 변환이라고합니다).

그래서 레일스 버그이거나 'id'열이 정수로 설정되지 않았습니다 (놀랄 것입니다). 당신이 그것을 해결할 수없는 경우

, 수동으로 변환 :

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

내 대답 좀 육체에 시간을내어 주셔서 감사합니다 :) – Sean

+0

아, 그냥 내 레일 3 방법을 잡고 그것을 열려면 131 페이지 lol – Damien

+0

시원한 - 전에는 each_with_object 보지 못했지만 조금 더 멋지다 inject ({}) – klochner

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