2012-07-01 5 views
2

내가 레일 액티브 그룹 쿼리가에 날짜를 구문 분석하는 방법 :루비 - 배열

a = Product.select("date(date) as date, count(id) as products").group("date(date)").to_a 

을 내가 배열의 모든 날짜의 형식을 변경하고 싶습니다.

a.map { |s, i| [Date.parse(s).to_time.strftime("%Y-%m-%dT%H:%M:%S"), i] } 

그러나, 나는 can't convert Product into String 오류가 점점 오전 : 나는 이런 식으로 뭔가있을 거라 생각 했어요. 배열에서 날짜를 파싱하고 형식을 변경하려면 어떻게합니까?

편집 : 여기

내가 찾고 있어요 출력의 예입니다.

이 테이블을 감안할 때 :

create_table :products do |t| 
     t.date :date 
end 

궁극적으로, 나는 위의 그룹 쿼리를 기반으로 JSON 출력을 만들려고합니다. 같은 뭔가 :

[{"products":23,"date":"2012-06-15T00:00:00"}, {"products":26,"date":"2012-06-16T00:00:00"}] 

답변

3

이 시도 :

a.map { |s, i| [Date.parse(s.date).to_time.strftime("%Y-%m-%dT%H:%M:%S"), i] } 

귀하의 질의는 두 개의 가짜 필드 dateproducts (SQL 쿼리와 동일)와 Product 객체의 배열을 반환합니다. 날짜를 얻으려면 반환 된 배열 요소에 s.date을 호출해야합니다.

은 당신이 할 수있는 배열을 원하는하려면 편집 :

query_result = Product.select("date(date) as date, count(id) as products").group("date(date)") 

query_result.map do |row| 
    { :products => row.products, :date => Date.parse(row.date).to_time.strftime("%Y-%m-%dT%H:%M:%S") } 
end 
+0

감사합니다. 그것은 날짜를 변환하는 데 일했습니다. 그러나 이제 배열은 모든 i 값에 대해 nil을 표시합니다. 예를 들면 다음과 같습니다 :'% = debug a %>'! ruby ​​/ object : 제품 속성 :! binary "ZGF0ZQ ==": '2012-05-27'! binary "Y2hlY2t0ZXN0cw ==": 1'; 그러나, <% = a.map {| s, i | [Date.parse (s.date) .to_time.strftime ("% Y- % m- % dT % H : % M : % S"), i]} %>'yield [' "2012-05-27T00 00 : 00 ", nil]]'. 왜 i 값이 0으로 변경됩니까? – diasks2

+0

글쎄, 나는 아직도 블록의 'i' 매개 변수에서 얻을 것으로 예상되는 것이 확실하지 않습니다. ['Array # map'] (http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-map) 메서드는 단일 매개 변수만을 블록에 전달합니다. 정렬. 예를 들어's' 매개 변수에는 현재'Product'가 있고 두 번째'i' 매개 변수에는 아무것도 없습니다. –

+0

혼란을 드려 죄송합니다. 내 목표는 해시 배열'a = Product.select ("date (date) as date, count (id) as products"). group ("date (date)"). to_a'로 끝나는 것입니다. yyyy-mm-dd 형식의 날짜는 yyyy-mm-ddThh : mm : ss 형식입니다. 그것이 최선의 방법이 아니라면 반드시'Array # map'을 사용할 필요는 없습니다. – diasks2

0

왜 당신이 당신의 액티브 :: JSON (a.to_json)의 관계와 JSON 시리얼 라이저가 처리 할 수 ​​있도록 서식을 직렬화하지 않습니다 데이트?

Product.select("date(date) as date, count(id) as products"). 
    group("date(date)").to_json 
+0

일부 검색을 수행 한 후 JSON 날짜 형식을 쉽게 지정할 수있는 방법을 찾지 못했습니다. JSON serializer가 형식을 처리하도록하는 방법의 예를 보여줄 수 있습니까? – diasks2

+0

앞의 예제는 날짜를'2012-06-16T13 : 53 : 46Z'과 같이 표시합니다. 틀린 것이 아니라면 기대하는 것입니다. – Jef

+0

'to_json'을 할 때, 앞의 예제는'datetime' 필드 대신에'date' 필드를 지정하기 때문에'2012-06-16'으로 포맷합니다. JSON 시리얼 라이저가이를 처리하도록 변경해 보겠습니다. – diasks2