誰かが私にARオブジェクトのこの振る舞いを説明できますか?
u = User.first
uu = u.dup
uu == u #=> true
u == uu #=> false
なぜ後者は真実ではないのですか?
誰かが私にARオブジェクトのこの振る舞いを説明できますか?
u = User.first
uu = u.dup
uu == u #=> true
u == uu #=> false
なぜ後者は真実ではないのですか?
これは、2番目のオブジェクトが新しいレコードの場合にActiveRecord::Base#==
返されるためです。false
なので、実行すると;uu.new_record?
が返されます。しかし、ですので、そのチェックに失敗しません。true
u == uu
false
u.new_record?
false
uu == u
この動作はRails3.0とその両方から変更されておりu == uu
、Rails 3.2(および場合によっては3.1)でuu == u
返されます。false
Ruby 1.9.3p194
これをとで実行するとfalseにRails 3.2.3
なるので、修正されたバグであるとしか考えられません。
そもそもなぜそれが起こったのかというと、私の理論では、複製されたレコードはそれがどこから来たのかを覚えているので、元のレコードと比較すると真に戻ることがわかっていました。オリジナルはそのような情報を持っていないので、それがクローンであることを認識する方法を知りません。