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
たぶん問題は出ないと思う。
よく考えられてるなぁ。