📖

Rails の ActiveRecord の比較は id を参照している

2024/03/18に公開

Rails の ActiveRecord のオブジェクトの比較は『 id が同じかどうか』という基準で判定しています。
具体的には このような 実装になっている。

user1 = User.create(name: "homu")
user2 = User.create(name: "homu")

# これは id が異なるので false
pp user1 == user2
# => false

なので次のようにオブジェクトは異なっていても id が同じ場合は true を返します。

user1 = User.create(name: "homu")
user2 = User.create(name: "homu")

# これは id が異なるので false
pp user1 == user2
# => false

# レコードは異なるが id が一緒なので true になる
user2.id = user1.id
pp user1 == user2

逆にいうと id が同じであれば他の値が違っていても true を返します。

User.create(name: "homu")

# 同じレコードを取得する
user1 = User.find_by(name: "homu")
user2 = User.find_by(name: "homu")

# 一部の値を書き換える
user1.name = "mami"

# この場合でも true を返す
pp user1 == user2
# => true

各属性の値を比較して処理したい場合は #attributes が利用できます。

User.create(name: "homu")

# 同じレコードを取得する
user1 = User.find_by(name: "homu")
user2 = User.find_by(name: "homu")

# 一部の値を書き換える
user1.name = "mami"

# #attributes だと各属性の値を Hash で返す
pp user1.attributes
# => {"id"=>1, "name"=>"mami"}

# それを利用して比較する
pp user1.attributes == user2.attributes
# => true
GitHubで編集を提案

Discussion