2010-08-19 4 views
1

updated_at 속성을 수정하려고 할 때마다 레코드가 업데이트 될 때마다 시간과 분이 0 인 날짜와 시간 만 표시되도록합니다. 2010-08-13 11:04:12 대신 2010-08-13 11:00:00이됩니다. Rails 2.3에서이 작업을 수행하는 가장 합리적인 방법은 무엇입니까?레일 오버라이드 updated_at 속성

업데이트

내가 생략 시간 초와 날짜, 데이터를 정렬하고 싶습니다 때문입니다 내가 무엇을 요청했습니다 싶은 이유.

감사합니다.

답변

4

데이터베이스에 저장된 값을 변경하지 마십시오. 당신이 그것을 출력되는 방식을 변경 :

timestamp = @model.updated_at # where @model is your model object 

# output it in a format that overrides the values for minute and second 
puts timestamp.strftime "%Y-%m-%d %H:00:00" 

당신이 사용할 수있는 다른 형식 지정자에 대한 strftime 루비 문서를 참조하십시오. 당신의 갱신을 바탕으로


, 나는 아직도 updated_at가 저장되는 방법을 변경하지 않고 대신 쿼리의 ORDER BY 내에서 날짜를 포맷 할 것입니다. 예를 들어,

ORDER BY DATE(updated_at), HOUR(updated_at), ... 

약 22,000 개의 레코드가있는 내 응용 프로그램의 라이브 테이블에 대해 매우 빠른 프로파일 링 테스트를 수행했습니다. ORDER BY updated_at은 2.94에서 3.19 초 사이에 완료되었으며 평균 시간은 3.00 초입니다. ORDER BY DATE(updated_at), HOUR(updated_at)은 2.93 초에서 3.06 초 사이에 완료되었으며 평균 시간은 2.99 초입니다. 여기에 프로파일 링 데이터는 다음과 같습니다 이것은 당신이 활성 레코드와해야 할 일이 아니다

+----------+------------+-----------------------------------------------------------------+ 
| Query_ID | Duration | Query               | 
+----------+------------+-----------------------------------------------------------------+ 
|  1 | 2.94530500 | SELECT * FROM posts ORDER BY updated_at       | 
|  2 | 2.94583800 | SELECT * FROM posts ORDER BY updated_at       | 
|  3 | 3.18711700 | SELECT * FROM posts ORDER BY updated_at       | 
|  4 | 2.96923700 | SELECT * FROM posts ORDER BY updated_at       | 
|  5 | 2.97255400 | SELECT * FROM posts ORDER BY updated_at       | 
|  6 | 3.06706800 | SELECT * FROM posts ORDER BY DATE(updated_at), HOUR(updated_at) | 
|  7 | 3.00414400 | SELECT * FROM posts ORDER BY DATE(updated_at), HOUR(updated_at) | 
|  8 | 2.95551500 | SELECT * FROM posts ORDER BY DATE(updated_at), HOUR(updated_at) | 
|  9 | 3.02181900 | SELECT * FROM posts ORDER BY DATE(updated_at), HOUR(updated_at) | 
|  10 | 2.93130000 | SELECT * FROM posts ORDER BY DATE(updated_at), HOUR(updated_at) | 
+----------+------------+-----------------------------------------------------------------+ 
+0

나는 그것을 언급하지 않은,하지만 난 데이터를 정렬하고 싶습니다 때문에 내가 부탁 한 일을하려는 이유는, 시간과 초가 생략 된 날짜. 물론 필자는 필자가 선택한 날짜를 형식화 할 수 있지만 좋은 성능 결정이라고는 생각하지 않습니다. – spacemonkey

+0

하지만 데이터 쿼리시 SQL 함수를 사용할 때 성능은 어떻습니까?이 데이터는 실제로 자주 쿼리되는 반면 매우 자주 업데이트되지 않기 때문에 – spacemonkey

+0

수동으로 설정하려고해도 Rails가 자동으로 업데이트되기 때문에'updated_at'이 저장되는 방식을 바꾸려면 약간의 둘러보기를 거쳐야합니다. 레코드를 저장할 때 원하는 값으로 설정하십시오. –

1

시간 스탬프 개체이므로 헬퍼 함수를 ​​사용하여 분/초 정보를 자르는 것이 가장 좋습니다.

1

whatever.created_at.strftime("%Y-%m-%d %H:00:00")

0

. 보기 도우미가 수행 할 수있는 것이므로 나중에 저장하는 방식을 변경하지 않아도됩니다.

strftime에 대해 생각하고 대신 변경할 수 있습니다. 도우미 파일에서

는 :

def format_date_for_rounded_hour(date) 
    date.striftime("%Y-%m-%d %H:00") 
end 
1

나는 다니엘의 솔루션을 추천 할 것입니다. 그러나 % 수정 된 "updated_at"필드와 함께 레코드를 저장하려는 경우, 주어진 모델에 대해 레일스 자동 타임 스탬프를 다시 구현해야합니다.

그래서, 모델에, 당신은 다음을 수행 할 수

self.record_timestamps = false # disables rails' auto-timestamping 
before_create :set_created_at 
before_save :set_updated_at 

def set_created_at 
    self.created_at = Time.now 
end 
def set_updated_at 
    self.updated_at = Time.now.change({:min => 0, :sec => 0}) # clears minutes and seconds 
end 
관련 문제