【发布时间】:2014-08-07 17:05:11
【问题描述】:
在对this question感兴趣后,我正在研究ActiveRecord如何定义关联属性方法。我注意到在 Rails 控制台中,如果我有一个 Chapter 的实例 has_many :videos,当我将各种参数传递给 chapter.videos 时,我会得到以下行为。我试图追踪 ActiveRecord 源代码中是如何定义属性方法的,但我很难理解。
> chapter.videos
Video Load (0.5ms) SELECT `videos`.* FROM `videos` ...
=> #<ActiveRecord::Associations::CollectionProxy [videos...]>
第二次调用似乎已经缓存/记住了视频
> chapter.videos
=> #<ActiveRecord::Associations::CollectionProxy [videos...]>
传入 false 没有区别,它也使用缓存
> chapter.videos(false)
=> #<ActiveRecord::Associations::CollectionProxy [videos...]>
然而,传入任何真实的东西总是会查询数据库
> chapter.videos(true)
Video Load (0.5ms) SELECT `videos`.* FROM `videos` ...
=> #<ActiveRecord::Associations::CollectionProxy [videos...]>
> chapter.videos(42)
Video Load (0.5ms) SELECT `videos`.* FROM `videos` ...
=> #<ActiveRecord::Associations::CollectionProxy [videos...]>
> chapter.videos("hello")
Video Load (0.5ms) SELECT `videos`.* FROM `videos` ...
=> #<ActiveRecord::Associations::CollectionProxy [videos...]>
ActiveRecord 使用这些参数在幕后做了什么?有谁知道这是在源代码中发生的位置以及如何发生的,或者这是否只是一些 Ruby 功能,当传入一些真实的东西时会重新加载缓存的属性?
【问题讨论】:
标签: ruby-on-rails ruby rails-activerecord