📖
Rails の ActiveRecord の比較は id を参照している
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
Discussion