where.not
アクティブレコードのwhere.notを使った実装を考えていたのですが、
where.notが変換されるSQL(WHERE ~ NOT IN)にはINの引数にNILLである値が含まれていると何も取得できないという注意点があるようなので、where.notでもそうなの?!と思い試してみました。
以下が試してみた内容です。
> Pet.where.not(id: [1,nil])
Pet Load (45.5ms) SELECT `pets`.* FROM `pets` WHERE NOT *1 LIMIT 11
=> #<ActiveRecord::Relation [#<Pet id: 2, name: "Puffball", owner: "Diane", species: "hamster", sex: "f", birth: "1989-08-31", death: "1995-07-29", created_at: "2019-11-04 09:28:57", updated_at: "2019-11-04 09:28:57">, #<Pet id: 3, name: "Bowser", owner: "Diane", species: "dog", sex: "m", birth: "1989-08-30", death: "1995-07-29", created_at: "2019-11-04 09:30:18", updated_at: "2019-11-04 09:30:18">, #<Pet id: 4, name: "Momiji", owner: "Hayashi", species: "dog", sex: "m", birth: "2003-08-12", death: nil, created_at: "2019-11-04 09:31:18", updated_at: "2019-11-04 09:31:18">, #<Pet id: 5, name: "Buffy", owner: "Nana", species: "dog", sex: "f", birth: "1991-10-10", death: nil, created_at: "2019-11-04 09:32:08", updated_at: "2019-11-04 09:32:08">, #<Pet id: 6, name: "chee", owner: "yoshino", species: "fish", sex: "f", birth: "1994-08-01", death: nil, created_at: "2019-11-09 13:57:26", updated_at: "2019-11-09 13:57:26">]>
どうやらアクティブレコード側で対処してくれているようで、ちゃんとこちらの希望通りに取得できておりました。
感想その他
アクティブレコードのwhere.notについても、
SQLのWHERE ~ NOT INについてもまだよくわからない部分があるので引き続き調べてみようと思います!
*1:`pets`.`id` = 1 OR `pets`.`id` IS NULL