オリジナルアプリに警告文が出た
validatesで警告文
エラー内容
チームメンバーを選択するのにusersテーブルからuser_name(英数字混合のID)を取得する予定。このuser_nameへのバリデーションでエラーが出てしまっている。
テーブル設計
## usersテーブル | Column | Type | Options | | --------- | ------ | ----------- | | nickname | string | null: false | | user_name | string | null: false | | email | string | null: false | | password | string | null: false | ### Association - has_many: team_users - has_many: team, through: team_users
## teamsテーブル | Column | Type | Options | | --------- | ------ | ----------- | | team_name | string | null: false | ### Association - has_many: team_users - has_many: user, through: team_users
## team_usersテーブル | Column | Type | Options | | ------- | --------- | ------------------------------ | | user | reference | null: false, foreign_key: true | | team | reference | null: false, foreign_key: true | ### Association - belongs_to: user - belongs_to: team
警告文
ターミナル:
DEPRECATION WARNING: Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1. To continue case sensitive comparison on the :user_name attribute in User model, pass `case_sensitive: true` option explicitly to the uniqueness validator.
と出力されました。
翻訳してみると、
非推奨の警告:一意性バリデーターは、Rails6.1で大文字と小文字を区別する比較を強制しなくなりました。Userモデルの:user_name属性で大文字と小文字を区別する比較を続行するには、明示的に`case_sensitive:true`オプションを一意性バリデーターに指定してください。
user_nameに一意性を付けたいと設けた部分
app/models/user.rb
validates :user_name, uniqueness: true
とした部分が警告が出ていました。
Rails 6で、MySQLを使っているときに、uniquenessのvalidationを使うと警告が出るようになっているようです。
どんな警告文?
昔々、Rails 5.2以前の仕様では、uniquenessバリデータはデフォルトで大文字小文字を区別する比較をしてくれていました。
つまり、'test'と’TEST'をデフォルトで区別しているということですが、デメリットがありました。
- DB上のユニーク制約に一致しないため、バリデーションの結果に信用性が低い。
- DB上のINDEXが効率よく使えないため、DBの負荷が大きくかかる。
現在のRails 6.1からの仕様では、uniquenessバリデータはデフォルトで大文字小文字を区別しなくなり、開発者が選択するように促しているようです。これが警告文の内容です。
警告文を消す
翻訳にあるように、`case_sensitive:true`オプションを一意性バリデーターに指定すると警告は消える。
validates :user_name, uniqueness: { case_sensitive: true }
しかし、
- DB上のユニーク制約に一致しないため、バリデーションの結果に信用性が低い。
- DB上のINDEXが効率よく使えないため、DBの負荷が大きくかかる。
のデメリットが有効になるそうです。このデメリットを解消する場合は、モデルのコードをいじるのではなくDB側のcollectionオプションにutf8_binを追加して「大文字小文字を区別するcollection」に変更する必要があるそうですが、手順が調べても分からなかったため上記のcase_sensetiveを追加しました。もし、今後分かったら書きたいと思います。
参考にさせていただいたページ