まず、これは私の他の質問に直接関連しています: ActiveRecord で "Mysql2::Error: Invalid date" を適切に処理するにはどうすればよいですか?
しかし、私はまだ、日付を修正する移行を書くというすべてのループを飛び越えたくありません。それは無効な日付を持つ最後のテーブルではないため、より一般的なアプローチが必要です。
だからここに行きます:
2010-01-00 や 0000-04-25 などの無効な日付を含むレガシー MySQL データベースを使用しています... Rails はそのようなレコードをロードしません (古いバージョンの Rails はロードしました)。
これらの日付を手動または自動で修正したくありません (修正できません)。これらの日付を修正するのは、それらの記録の作成者次第です。古いシステムは、そのような煩わしさを許容する PHP アプリケーションでした。Rails アプリケーションは、日付が有効になるまでユーザーがレコードを保存できないようにする必要があります。
問題は Rails 自体にあるようには見えませんが、Rails mysql gem の .so ライブラリの奥深くにあるようです。
したがって、私の質問は、日付を検証する方法や無効な日付を挿入する方法に関するものではありません。私はそれをしたくありません。それは、stackoverflow やその他のインターネット全体の多数の回答でカバーされています。私の質問は、Rails が 1000 個の小さな断片に爆発することなく、データベースに既に存在する MySQL から無効な日付を読み取る方法です...
列の型はDATETIME
です。Rails は ActiveRecord 関連の解析が開始される前にチョークするため、文字列へのキャストが役立つかどうかはわかりません。
正確なエラーとバックトレースは次のとおりです。
$レールc 開発環境のロード (Rails 3.2.13) irb(メイン):001:0> Poll.first ポーリング ロード (0.5ms) SELECT `polls`.* FROM `polls` LIMIT 1 Mysql2::エラー: 無効な日付: 2003-00-01 00:00:00 from /home/kakra/.gem/ruby/1.8/gems/activerecord-3.2.13/lib/active_record/connection_adapters/mysql2_adapter.rb:216:in `each' from /home/kakra/.gem/ruby/1.8/gems/activerecord-3.2.13/lib/active_record/connection_adapters/mysql2_adapter.rb:216:in `to_a' from /home/kakra/.gem/ruby/1.8/gems/activerecord-3.2.13/lib/active_record/connection_adapters/mysql2_adapter.rb:216:in `exec_query' from /home/kakra/.gem/ruby/1.8/gems/activerecord-3.2.13/lib/active_record/connection_adapters/mysql2_adapter.rb:224:in `select' from /home/kakra/.gem/ruby/1.8/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/database_statements.rb:18:in `select_all' from /home/kakra/.gem/ruby/1.8/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/query_cache.rb:63:in `select_all' from /home/kakra/.gem/ruby/1.8/gems/activerecord-3.2.13/lib/active_record/querying.rb:38:in `find_by_sql' from /home/kakra/.gem/ruby/1.8/gems/activerecord-3.2.13/lib/active_record/explain.rb:41:in `logging_query_plan' from /home/kakra/.gem/ruby/1.8/gems/activerecord-3.2.13/lib/active_record/querying.rb:37:in `find_by_sql' from /home/kakra/.gem/ruby/1.8/gems/activerecord-3.2.13/lib/active_record/relation.rb:171:in `exec_queries' from /home/kakra/.gem/ruby/1.8/gems/activerecord-3.2.13/lib/active_record/relation.rb:160:in `to_a' from /home/kakra/.gem/ruby/1.8/gems/activerecord-3.2.13/lib/active_record/explain.rb:34:in `logging_query_plan' from /home/kakra/.gem/ruby/1.8/gems/activerecord-3.2.13/lib/active_record/relation.rb:159:in `to_a' from /home/kakra/.gem/ruby/1.8/gems/activerecord-3.2.13/lib/active_record/relation/finder_methods.rb:380:in `find_first' from /home/kakra/.gem/ruby/1.8/gems/activerecord-3.2.13/lib/active_record/relation/finder_methods.rb:122:in `first'から from /home/kakra/.gem/ruby/1.8/gems/activerecord-3.2.13/lib/active_record/querying.rb:5:in `__send__' from /home/kakra/.gem/ruby/1.8/gems/activerecord-3.2.13/lib/active_record/querying.rb:5:in `first' (irb) から:1
バックトレースは同じままです。Poll.first.title
そのようにしても、一部の日付は IRB の出力ルーチンに決して到達してはならず、したがって決して解析されるべきではありません。したがって、型キャストの前に値を使用するという提案は役に立ちません。