みるべあのエンジニア日記

勉強したことについてTwitterとガチブログの中間くらいのスタンスで書く日記

Rails5.2 から 6.x にアップグレードしたときの where.not の話

Rails 5.2 から 6.0 にアップグレードしたときに出た警告

DEPRECATION WARNING: NOT conditions will no longer behave as NOR in Rails 6.1. To continue using NOR conditions, NOT each condition individually 以下略.

Rails 6.1 からは where.not メソッドが NORではなくNANDに仕様が変わるということ。 github.com

NORとは

NORは日本語で「否定論理和」といい、与えられた複数の命題の全てが偽であることを示す論理演算です。 つまり、ベン図で表現すると下記の色を塗った部分です。

f:id:milkybear814:20201211024809p:plain

「either A nor B」(AでもBでもない)なんて英文ありましたね💡

NANDとは

NANDは日本語で「否定論理積」といい、与えられた複数の命題のうちに偽であるものが含まれることを示す論理演算です。 つまり、ベン図で表現すると下記の色を塗った部分です。

f:id:milkybear814:20201211025245p:plain

したがって、NORとして扱いたい場合は where.not の引数は一つにしてメソッドチェーンしなさいねという警告だったわけですね。 例えば、

User.where.not(gender: :male, favorite: :apple)

とした場合に、Rails 5.2 では下記1つの条件のみ当てはまります。

  • 男性ではない&リンゴが好きではない

一方、Rails 6.1 になると、以下3つが当てはまってしまうということ。

  • 男性&リンゴが好きではない
  • 男性ではない&リンゴが好き
  • 男性ではない&リンゴが好きではない

なので、Rails 6.1 で対応させるのであれば下記のように書かなければならないということですね。

User.where.not(gender: :male).where.not(favorite: :apple)

はい、ということで2020年12月9日に Rails 6.1.0 がリリースされましたね!🎉

rails/CHANGELOG.md at v6.1.0 · rails/rails · GitHub