Rails 一个 Rails 对象缓存的小问题

hexogen · 2016年08月30日 · 最后由 hexogen 回复于 2016年08月30日 · 1391 次阅读

系统信息:

  • rails: 5.0.0
  • ruby: 2.3.0
  • os: Mac OS X El Captian 10.11.6

代码如下:

module ProductsHelper
  def get_cs_case_count cs_id
    logger.debug "**************** cs_id is: #{cs_id}"
    count = CaseSet.find(cs_id).testcase.count
    logger.debug "**************** case count is: #{count}"
    return count
  end
end

代码的用处是在页面 erb 模板上调用,返回当前的 CaseSet 有多少的 case, Product 有多个 CaseSet, 每个 CaseSet 有很多 Textcase 在一个页面上会有多次调用。

----------- 以上是业务说明-----分割-------------

第四行,我开始写的是

count = CaseSet.find_by('id', cs_id).testcase.count

发现 find_by 返回的对象被缓存了,每个页面上展示的 count 都是一样的,于是修改为:

count = CaseSet.find_by('id', cs_id, force_reload: true).testcase.count

但是无效...(这个修改的来源如下:http://guides.ruby-china.org/association_basics.html 章节 4.1.1.1) 尝试做如下修改:

count = CaseSet.find(cs_id).testcase.count

好了...

作为一个第一次写 rails 的苦手,哪位大神讲解下到底是因为什么原因呢?find 和 find_by 的缓存机制有什么不同么?

你用错了find_by 看链接

#1 楼 @tesla_lee 我按照你说的改了下,果然可以. 按照这个思路看了下,我原来写错的方法被解析成了

SELECT  "case_sets".* FROM "case_sets" WHERE (id) LIMIT ?  [["LIMIT", 1]]

也就是返回了当前的第一条记录,然后

SELECT COUNT(*) FROM "testcases" WHERE "testcases"."case_set_id" = ?  [["case_set_id", 19]]

就成了每次都是查询固定的一个对象了。

谢啦,一语点醒啊~~~

hexogen 关闭了讨论。 10月11日 22:06
需要 登录 后方可回复, 如果你还没有账号请 注册新账号