55
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ActiveRecordでstrict_modeを無効にする

Last updated at Posted at 2014-10-27

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

55
50
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
55
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?