AR#==

ActiveRecordの==はどう動くのか気になったので調べてみた。
例えばSNSで日記にユーザからコメントがついた場合、新着に表示する時にはまず日記を書いたユーザとコメントを書いたユーザが別かどうかを判定しなきゃいけない。


早速ソースを読む。

def ==(comparison_object)
  comparison_object.equal?(self) ||
    (comparison_object.instance_of?(self.class) && 
      comparison_object.id == id && 
      !comparison_object.new_record?)
end

つまり、

  • オブジェクトIDが同じ場合はtrue
  • idが一緒ならtrue、ただし新規レコードはfalse

と言う事。


#IDが一緒ならTrue
user1 = User.find(1)
user2 = User.find(1)
user1 == user2  #=> true

#IDが違えばfalse
user3 = User.find(2)
user1 == user3 #=> false

#オブジェクトIDが一緒ならtrue
user4 = user1
user4 == user1 #=> true

user4.id = 3
user4 == user1 #=> true
user1.id #=> 3


#新規レコードならIDが一緒でもfalse
user_new1 = User.new
user1 == user_new1 #=> false

user_new1.id = 1
user1 == user_new1 #=> false

#新規レコード同士でIDが一緒でもfalse
user_new2 = User.new
user_new2.id = 1
user_new1 == user_new2 #=>false


たぶん問題は出ないと思う。
よく考えられてるなぁ。