モデルの双方向の関連付けをinverse_ofで整合性を保つようにする
モデルの関連付けをしているので、同じことを意味するのにobject_id
が違うためにfalse
になるパターンです。
モデル例
class User < ActiveRecord::Base has_many: comments end class Comment < ActiveRecord::Base belongs_to: user end
こんな関連付けをしているものがあるとします。
x = User.first y = x.comments.first x.email == y.user.email => true x.email = 'hoge' => "hoge" x.email == y.user.email => false
同じものを表しているので、true
でもいい気がします。
ここでobject_id
メソッドを使用して確かめます。
x.email.object_id => 70351183381180 y.user.email.object_id => 70351183859600
やっぱり違いますね。
これでinverse_of
をつけて確かめます。
class User < ActiveRecord::Base has_many: comments, inverse_of: :user end class Comment < ActiveRecord::Base belongs_to: user, inverse_of: :comments end
同じことをしてみます。
x = User.first y = x.comments.first x.email == y.user.email => true x.email = 'hoge' => "hoge" x.email == y.user.email => true
同じオブジェクトとして認識されていますね。
object_id
で確認します。
x.email.object_id => 70213649987700 y.user.email.object_id => 70213649987700
同じオブジェクトになっています。
inverse_ofを使用することで、メモリの効率化ができるようです。
以上です。
何かあれば、意見をお待ちしております!