2010-07-26 3 views
5

Active Records fault라고 생각되는 문제가 발생했습니다. 작업이 포함 된 XML 파일을 구문 분석하고 있습니다. 이 XML 파일에는 시간 형식이 00:00:00 인 walltime을 나타내는 노드가 들어 있습니다. 나는 또한 이러한 일을 받아 들일 모델을 가지고있다. 그러나 시간이 실제 24 시간보다 클 경우 활성 레코드는이 값을 NULL로 삽입합니다. 아래 예 :Ruby on Rails를 사용하여 시간 열에 시간 삽입

INSERT INTO `jobs` (`jobid`, `walltime`) VALUES('71413', 'NULL') 

INSERT INTO `jobs` (`jobid`, `walltime`) VALUES('71413', '15:24:10') 

아이디어가 있으십니까? 고맙습니다!

+0

당신이 자세히 설명해주십시오 것 문제 란 말이 오? 오류 또는 무엇인가를 줄 ? – Salil

+0

데이터베이스의'walltime'이 varchar 또는 text를 허용하도록 구성 되었습니까? 아니면 어떤 마법 형식의 시간 형식입니까? (이것이 내 응용 프로그램이라면 데이터베이스에 정수로 초 수를 저장하고 뷰에 서식을 남겨 둡니다.) – sarnold

+1

어떤 데이터베이스에서 실행합니까? 그것이 MySQL이고 walltime 속성이 Time 타입 인 경우 MySQL은 Time 타입을 통해 경과 시간을 처리 할 수 ​​있기 때문에 흥미로운 캐치 일 수 있습니다.이 경우 ActiveRecord는 walltime 속성을 NULL로 typecast하지 않습니다. –

답변

5

표준 SQL timedatetime 데이터 유형은 기간을 저장하기위한 것이 아닙니다. 아마도 해당 표준과 일치하여 ActiveRecord's time attribute assignment logictime parsing rules of the native Ruby Time class을 사용하여 잘못된 시간을 거부합니다.

당신이 의도 한대로, 지속 시간을 저장하는 방법은 하나입니다 :

  1. 스토어 정수로 지속 시간 (예 : "초 단위"), 또는
  2. 상점이 (날짜) 번하는 시작과 끝, 그리고 그들에 날짜 계산을 사용합니다.
class Thing < ActiveRecord::Base 
    ... 
    def duration 
    return start - end 
    end 

    def duration=(length) 
    start = Time.now 
    end = start + length 
    end 
    ... 
end 
+1

이것은 MySQl의 경우에는 해당되지 않습니다 (다른 구현에 대해 알지 못함). 여기를보십시오 : http://dev.mysql.com/doc/refman/5.0/en/time.html ("... 값의 범위는 '-838 : 59 : 59'에서 '838 : 59 : 59'까지입니다. TIME 유형은 하루 중 시간 (24 시간 미만이어야 함)뿐만 아니라 경과 시간 또는 두 이벤트 사이의 시간 간격을 나타 내기 위해 사용될 수 있기 때문에 시간 부분이 너무 클 수도 있습니다 (이는 시간보다 훨씬 클 수 있습니다). 24 시간 또는 심지어 음수). ") –

+0

안녕 밀라노 - 네, MySQL은 Time 열에서 기간 저장을 지원할 수 있습니다.하지만 Active Record는 크로스 db 호환이 가능하기 때문에 시간을"유용하게 "해석 할 수 있습니다 클럭 타임 전용. 그러므로 그것은 "유효하지 않은 시간"으로 간주되는 것을 무효로 만들 것입니다. 따라서 여기의 duration 옵션은 실제로 작동 할 것임을 보장하기위한 더 좋은 방법 일 것입니다. –

+1

@Taryn 우리의 의심에 따라, 나는 정확히 그것을하는 코드를 발견했습니다. –

관련 문제