Rails 4.0からActiveRecordにstrict_modeが導入され、デフォルトでは接続時にsql_mode = STRICT_ALL_TABLES
をセットするようになりました。
これは、既に運用されているDBに接続する等なんらかの理由でMySQL側で適切な設定が行えていない場合有用な動作ですが、そうでない場合、サーバー側の設定を鑑みずにクライアント側が設定を上書きするべきではないでしょう。
そのため、database.ymlでstrict: false
と設定することでこの動作を無効にすることができましたが、Rails 4.2.0ではこの動作が変更され、strict: false
のときはstrictでない状態にするためsql_mode = ''
をセットするようになりました。
MySQLのデフォルトのsql_modeに依存して既に通っていたはずのテストが通らなかったりすることがあり、テストを通すためにstrict: false
のときはstrictでない状態にする必要があったようです。
これによってstrict: false
はsql_mode = ''
をセットしてしまうので、Rails 4.2.0では別のワークアラウンドが必要です。
現状、database.ymlでsql_mode: :default
を設定するのがもっとも副作用がない方法だと思われます。
production:
adapter: mysql2
database: foo_prod
user: foo
variables:
sql_mode: :default
Rails <= 4.0.5, 4.1.0, 4.1.1
にはこの修正がバックポートされていないので:sql_mode: :default
とvariablesのキーをシンボルにしないとstrictの設定が後勝ちします。