【Rails】inverse_of在has_many和belongs_to中的用法

最近使用Rails时,遇到了通过关联关系来多次访问同一条record,虽然得到的内容一样,但是每次都会创建不同对象的情况。

通过查询Rails官方文档,找到了对关联关系的一种设置inverse_of,可以避免在一些情况下重复创建对象的问题。

但是,文档中提到了inverse_of的限制:

  • 不能和 :through 选项同时使用
  • 不能和 :polymorphic 选项同时使用
  • 不能和 :as 选项同时使用
  • 在 belongs_to 关联中,会忽略 has_many 关联的 inverse_of 选项

对于最后一条,文档并没有详细解释,因此我针对于Rails3.2.18版本做了试验,但得到的结果与文档中的例子并不一致,现我把实验步骤和结果贴出来供大家参考讨论。

1. 不设置inverse_of

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

rails c 结果展示:

p = Post.first
c = p.comments.first
c.post.object_id == p.object_id # => false

可以看出,当不设置inverse_of时,c.postp在内存中指向不同的对象。

2. has_many设置inverse_of

class Post < ActiveRecord::Base
  has_many :comments, :inverse_of => :post
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

rails c 结果展示:

p = Post.first
c = p.comments.first
c.post.object_id == p.object_id # => true

可以看出,当在has_many处设置inverse_of时,c.postp在内存中都指向同一个对象。

3. belongs_to设置inverse_of

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post, :inverse_of => :comments
end

rails c 结果展示:

p = Post.first
c = p.comments.first
c.post.object_id == p.object_id # => false

可以看出,当在belongs_to处设置inverse_of时,c.postp在内存中指向不同的对象。

4. has_many和belongs_to都设置inverse_of

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post, :inverse_of => :comments
end

rails c 结果展示:

p = Post.first
c = p.comments.first
c.post.object_id == p.object_id # => true

可以看出,当在has_many和belongs_to处都设置inverse_of时,c.postp在内存中都指向同一个对象。


通过上面4个测试,可以看到真正起作用的是:在has_many处设置inverse_of,而不是在belongs_to处设置。并且,当同时在has_many和belongs_to设置inverse_of的时候,文档中所描述的“在 belongs_to 关联中,会忽略 has_many 关联的 inverse_of 选项”是不正确的,此时has_many处设置的inverse_of是有效的。

以上是本人的意见看法,如有错误,欢迎大家指正讨论。

转载请注明出处:http://blog.csdn.net/sunset108/article/details/51742228

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值