Edited at

ActiveRecordでstrict_modeを無効にする

More than 5 years have passed since last update.

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: falsesql_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の設定が後勝ちします。


SEE ALSO