最近一个业务是仿照 includes 对多个模型进行取值,统一 sql 查询达到减少 IO 的频率,看了半天 incldes 的实现原理还是比较懵,rails 是如何对 sql 查出的数据进行持久保存的,includes 又是如何在调用 has_many 时直接取查询到的数据而不走数据库的。
有点没看懂题目描述,大概是这个?
https://ruby-china.org/topics/17866
顺便问下:includes 是咋和“双向绑定”这个词联系到一起的?
这里的双向绑定是说数据如何知道当在 includes 中声明了某个模型关系的时候,在业务中通过实例调用时,rails 是如何保存模型关联与数据的绑定的,又是如何不触发 sql 查询而直接获取到数据的 (不考虑懒加载).所以我就不太严谨的用了"双向绑定"这个词
触发sql
has_many 数据存在内存
https://github.com/rails/rails/blob/v5.2.3/activerecord/lib/active_record/reflection.rb
https://github.com/rails/rails/blob/b9ca94caea2ca6a6cc09abaffaad67b447134079/activerecord/lib/active_record/associations/preloader/association.rb#L44
loaded?
你想说的是为什么走缓存么?
目前是想写一个拦截器,初始化所有需要使用到的数据,然后实现 sql 缓存机制让当前进程能通用缓存而不是再去查数据库,不知道可不可行。