読者です 読者をやめる 読者になる 読者になる

モデルの双方向の関連付けをinverse_ofで整合性を保つようにする

rails

モデルの関連付けをしているので、同じことを意味するのに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

やっぱり違いますね。

ref.xaio.jp

これで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を使用することで、メモリの効率化ができるようです。

以上です。

何かあれば、意見をお待ちしております!