diary

I like Hatena Star with a text selection.

2022-05-02

github.com

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#mergeHash#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