【Rails】inverse_of在has_many和belongs_to中的用法
来源:互联网 发布:金山软件资产 编辑:程序博客网 时间:2024/05/16 04:38
最近使用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 :commentsendclass Comment < ActiveRecord::Base belongs_to :postend
rails c
结果展示:
p = Post.firstc = p.comments.firstc.post.object_id == p.object_id # => false
可以看出,当不设置inverse_of时,c.post
和p
在内存中指向不同的对象。
2. has_many设置inverse_of
class Post < ActiveRecord::Base has_many :comments, :inverse_of => :postendclass Comment < ActiveRecord::Base belongs_to :postend
rails c
结果展示:
p = Post.firstc = p.comments.firstc.post.object_id == p.object_id # => true
可以看出,当在has_many处设置inverse_of时,c.post
和p
在内存中都指向同一个对象。
3. belongs_to设置inverse_of
class Post < ActiveRecord::Base has_many :commentsendclass Comment < ActiveRecord::Base belongs_to :post, :inverse_of => :commentsend
rails c
结果展示:
p = Post.firstc = p.comments.firstc.post.object_id == p.object_id # => false
可以看出,当在belongs_to处设置inverse_of时,c.post
和p
在内存中指向不同的对象。
4. has_many和belongs_to都设置inverse_of
class Post < ActiveRecord::Base has_many :commentsendclass Comment < ActiveRecord::Base belongs_to :post, :inverse_of => :commentsend
rails c
结果展示:
p = Post.firstc = p.comments.firstc.post.object_id == p.object_id # => true
可以看出,当在has_many和belongs_to处都设置inverse_of时,c.post
和p
在内存中都指向同一个对象。
通过上面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
- 【Rails】inverse_of在has_many和belongs_to中的用法
- has_many 和belongs_to
- rails has_many on polymorphic
- Example Of has_many In Rails's ActiveRecord
- Rails 5中belongs_to默认不允许nil
- yii的relations里self::BELONGS_TO的用法
- Rails中的includes和joins的区别与用法(翻译,部分)
- Thinkphp中表关联HAS_ONE和BELONGS_TO的区别
- overflow在CSS中的意思和用法
- static在C和C++中的用法
- string在C和C++中的用法
- Timer和TimerTask在Android中的用法
- Timer和TimerTask在Android中的用法
- Rails中 Send 和respond_to用法
- 关于MVC在Rails中的体现
- Web 缓存及在 Rails 中的使用
- Redis在Rails中的应用实例
- has_many polymorphic
- 20150503字符串实战
- 关于IOS中禁用第三方键盘
- ArcGIS Online试用 (1)
- retrofit 2.0 +RxAndroid 使用中遇到异常 【abstract method not implemented】
- 飛飛(七十九)(补)阅读程序
- 【Rails】inverse_of在has_many和belongs_to中的用法
- Java算法<1> ----持续更新中
- 【腾讯内部干货分享】分析Dalvik字节码进行减包优化
- iOS 蓝牙开发 UUID不能使用 isConnected不能使用的问题解决
- C# 其他
- Ubuntu 修改apt源
- linux ssh key登陆
- WPF中ListBox相应鼠标滚动上下翻
- Maven install报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile