誰かが私に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?が返されます。しかし、ですので、そのチェックに失敗しません。trueu == uufalseu.new_record?falseuu == u
この動作はRails3.0とその両方から変更されておりu == uu、Rails 3.2(および場合によっては3.1)でuu == u返されます。false
Ruby 1.9.3p194これをとで実行するとfalseにRails 3.2.3なるので、修正されたバグであるとしか考えられません。
そもそもなぜそれが起こったのかというと、私の理論では、複製されたレコードはそれがどこから来たのかを覚えているので、元のレコードと比較すると真に戻ることがわかっていました。オリジナルはそのような情報を持っていないので、それがクローンであることを認識する方法を知りません。