2022-05-02
Rails 7のリリースノートを読んでいて、Active Recordの変更が一部Active Jobのセクションに書かれていたのに気がついたので修正した。
AR::Relation#merge
は、同じカラムに対するwhereがあった時は引数の方の条件で上書きする、という挙動を知った。
User.where(name: 'foo', id: 1).where(id: 2) # WHERE name = 'foo' AND id = 1 AND id = 2 User.where(name: 'foo', id: 1).merge(User.where(id: 2)) # WHERE name = 'foo' AND id = 2
merge
を使った場合もwhere
を直接書いたのと同じ結果になると思っていたので驚いた。merge
は2つのクエリの積を取るようなメソッドだと誤解していた。
AR::Relation#merge
はHash#merge
などと同じような挙動をする、ということっぽい。
この挙動は、Rails 7のリリースノートの#merge
の非互換を読んでいて知った。
https://railsguides.jp/7_0_release_notes.html#active-record-%E4%B8%BB%E3%81%AA%E5%A4%89%E6%9B%B4%E7%82%B9