2012-06-13 2 views
1

ruby ​​1.8.7에서 mysql2 0.3.11 (mysql 14.14 서버에 대해)을 사용하고 있는데 created_at 또는 updated_at 값이 잘못된 DateTime이 될 수 있으며 내 앱이 "Invalid date: 2022-03-00 00:00:00"이라는 메시지와 함께 예외를 던질 수 있습니다.created_at 및 updated_at에 유효하지 않은 datetimes를 삽입하는 레일

created_atupdated_at 열을 사용하여 명시 적으로 작성, 설정, 읽기 또는 작업을 수행하지 않습니다.

mysql 클라이언트를 통해 테이블을 검사하면 대부분이 열의 값은 "0000-00-00 00:00:00"이며이 값은 레일스에서 ​​nil으로 끝납니다. 그러나 여러 행은 "2022-03-00 00:00:00"과 같은 값을 표시합니다 (2022 년에 모두 알 수 있지만 모두 다릅니다).

흥미롭게도 나는 객체를 생성 할 수 없으므로 레일스에서 ​​.destroy()을 실행할 수 없습니다.

해당 열에 대해 잘못된 날짜를 설정할 수있는 것은 무엇입니까?

편집 : 이것은 모든 테이블에서 발생합니다. 여기 내 schema.rb이며, 테이블 중 하나에 대한 마이그레이션의 모든 : https://gist.github.com/2930655

Edit2가 : 나는 (내 대답은 아래를 참조)에게 자신을 해결하지만, 당신이 그것을 인 경우에 무게를 줄 경우 감사하겠습니다 버그, 그렇다면 어떤 패키지가 버그인지 (ActiveRecord?).

+0

해당 테이블에 대한 마이그레이션은 무엇이며 schema.rb에는 어떤 것이 있습니까? – MBHNYC

답변

0

Time#to_s을 오버로드하여 유효하지 않은 값을 SQL에 전송했기 때문에이 문제가 발생하는 것으로 나타났습니다 (DateTime에 HH : MM : SS를 보냈습니다).

MySQL과 SQLite는 모두이 형식으로 DateTimes를 구문 분석하지 못하고 가비지 값을 가져 오지만 Ruby에 따르면 SQLite의 값은 결코 "유효하지 않습니다"이므로 절대로이를 발견하지 못했습니다.

이제 Time이나 DateTime이있는 개체를 다른 열에 저장하고이를 Time/DateTime 개체로 설정하면 올바르게 설정되므로 버그라고 말할 수 있습니다.