2013-11-26 2 views
0

에 해시의 모든 값을 변환 I DB를 특정 컬럼을 가져 오기 위해 다음 코드 조각이 :이다 해시의 결과 배열에루비 문자열

@data = Topic.select("id,name").where("id in (?)",@question.question_topic.split(",")).map(&:attributes) 

을 :

현재 :

01 :

@data = [ { "id" => 2, "name" => "Sports" }] 

을하도록 변경

@data = [ { "id" => "2", "name" => "Sports" }] 

"id"를 string, fixnum으로 변환하고 싶습니다. Id는 db의 정수입니다. 가장 확실한 방법은 무엇입니까?

참고 : .map(&:attributes)을 사용한 후 활성 레코드 관계가 아닙니다.

+1

왜 'ActiveRecord'객체의 관계 대신 정확히 해시로 사용 하시겠습니까? –

+0

업데이트 됨. 참조하십시오. –

+0

어떤 버전의 레일을 사용합니까? '뽑아 라 '는 대단해! –

답변

2

당신은 적절한 map 사용하여 수행 할 수 있습니다

topics = Topic.select("id,name").where("id in (?)",@question.question_topic.split(",")) 
@data = topics.map do |topic| 
    { 
    'id' => topic.id.to_s, 
    'name' => topic.name 
    } 
end 
+0

topic.id 및 topic.name이 작동하지 않습니다. 편집을 제출했습니다. 일반적으로 이것은 다소 제한적이라고 생각합니다. 예를 들어, 내일 그가 그 모델의 다른 것을 사용하고 싶다면? 그런 다음 그는 두 곳에서 그것을 고쳐야 할 것입니다. – Niall

+0

왜 작동하지 않을 것이라고 생각하십니까? –

+0

오, 당신은지도 속성을 없애 버렸습니다. – Niall

1

은 당신이 찾고있는 간단한 방법은 (내가 그 어쨌든 충분히 간단 생각) 정말 없다 단순히

@data.each { |obj| obj["id"] = obj["id"].to_s } 

입니다.

다른 질문을 의미하는 제목으로 간다 - 당신이 할 수있는 문자열로 해시의 모든 값을 변환 :

@data.each do |obj| 
    obj.map do |k, v|   
     {k => v.to_s} 
    end 
end 

그냥 어쨌든이 떠나.

+0

나는 다른 방법으로이 방법을 알고 있었습니까? –

+0

@VarunJain 둘 중 어느 것을 찾고 계십니까? 모든 값을 문자열로 변환하거나 id attr로 변환합니까? – Niall

+0

두 번째 것. –

-1

이 해시의 모든 키 이름을 반복하고 키와 관련된 자료의 #to_s 버전 값을 대체합니다. nil은 빈 문자열로 변환됩니다. 또한 임베디드 배열이나 다른 해시와 같이 해시 내에 복잡한 데이터가 없다고 가정합니다.

def hash_values_to_string(hash) 
    hash.keys.each {|k| hash[k]=hash[k].to_s}; hash 
end 
+0

이 코드가 질문에 대답 할 수 있지만 문제를 해결하는 방법 및/또는 이유를 설명하는 추가 컨텍스트를 제공하면 대답의 장기적인 가치가 향상됩니다. –