使用rails presenters - memoizable在3.1中被弃用 - 使用|| =而不是?

时间:2011-10-28 13:31:27

标签: ruby-on-rails ruby-on-rails-3 presenter memoization

问题:尽可能避免创建多个对象或多个查询。

我正在使用带有rails的Presenters作为最佳实践。

我遵循的建议是,使用“扩展ActiveSupport.Memoizable”(然后使用memoize:方法来使用它们)比使用@the_record = record ||= @record样式设置项目更好问题 - false或nil没有存储,所以再次调用查询,memoizable更好地使用缓存(即使用它!)。

但是我看到memoizable在rails 3.1中被弃用了 注意我在运载波下的github和声明: “弃用警告:不推荐使用ActiveSupport :: Memoizable,将在以后的版本中删除,只需使用Ruby memoization模式。(在/Users/kain/.rvm/gems/ruby-1.9.3-preview1/bundler/中调用extend宝石/ carrierwave-c4459179b0f8 / LIB / carrierwave / mount.rb:284"

也许它已经解决了?有人知道吗?

有关今后使用的最佳做法的任何建议吗?使用|| =语法?上述问题怎么样?

enter image description here

1 个答案:

答案 0 :(得分:7)

||=方法非常适合返回值为true的值的东西,但对于没有返回值的东西,它不能很好地工作。 memoize通过捕获这些条件并相应返回来解决此问题。如果您想要容纳nil

,您可以采取这样的方法
def some_method
  return @some_method if (instance_variable_defined?(:"@some_method"))

  @some_method = begin
    ...
  end
end

这只是检查变量是否已定义,而不是是否已设置,这在您的情况下是一个重要的区别。

我不确定你为什么认为它被弃用[来自Michael的注释,它在3.2中被弃用,见下面的注释]。 documentation表示它在3.1中仍然是最新的。有些实现在从一个模块移动到另一个模块时被标记为“已弃用”,但该工具仍然可用。