出力するケース
railsのバリデーションuniqueness
の"大文字小文字の区別"と、対するDBのユニーク制約の"大文字小文字の区別"に不整合があるときに発生します。
具体例
たとえば、railsで以下の様にmodelを定義していたとします。
class Account < ApplicationRecord
validates :email, uniqueness: true
end
そして、DBにMysqlを使用していてaccounts.email
にutf8mb4_unicode_ci
などのcase insensitiveなcollation
を指定していたとします。
この時にも同様のWARNIGが出力されます。
出力する理由
Account
モデルのバリデーションuniqueness
のcase_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