LoginSignup
29
21

More than 1 year has passed since last update.

rails6.0でWARNING"DEPRECATION WARNING: Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1"が発生する理由

Last updated at Posted at 2019-05-22

出力するケース

railsのバリデーションuniquenessの"大文字小文字の区別"と、対するDBのユニーク制約の"大文字小文字の区別"に不整合があるときに発生します。

具体例

たとえば、railsで以下の様にmodelを定義していたとします。

class Account < ApplicationRecord
  validates :email, uniqueness: true
end

そして、DBにMysqlを使用していてaccounts.emailutf8mb4_unicode_ciなどのcase insensitiveなcollationを指定していたとします。
この時にも同様のWARNIGが出力されます。

出力する理由

Accountモデルのバリデーションuniquenesscase_sensitiveオプションが未指定なのでデフォルトの挙動case_sensitive = trueになります。

その為、railsでのユニークバリデーションは
「大文字小文字の区別をするユニーク制約」を行います。

一方、DBのcollationはutf8mb4_unicode_ciなので、
「大文字小文字の区別をしないユニーク制約」を行います。

この不整合がMysqlでは様々な問題を起こしていたそうで、
rails6.1では仕様変更を行い、デフォルトの挙動を"DBのcollationに合わせる"にする様です。

なのでこのケースだとrails6.1以降はAccountのユニークバリデーションもDBにあわせて
「大文字小文字の区別をしないユニーク制約」に変更されます。

WARNIGの意味

"このケースだとrails6.1以降は挙動が変わるから、rails6.0以前(現在)の挙動を維持したい場合は
明示的にcase_sensitive: trueを指定してね"って事っぽいです。

railsでのユニークバリデーションは
「大文字小文字の区別をするユニーク制約」を行います。

一方、DBのcollationはutf8mb4_unicode_ciなので、
「大文字小文字の区別をしないユニーク制約」を行います。

参考

https://blog.kamipo.net/entry/2019/05/15/152652
https://railsguides.jp/active_record_validations.html#uniqueness

29
21
3

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
29
21