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

Mic*_*ant 6 ruby-on-rails memoization presenter ruby-on-rails-3

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

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

我遵循的建议说,使用"扩展ActiveSupport.Memoizable"(然后使用memoize:方法来使用它们)比使用@the_record = record ||= @record样式设置项目更好,因为有几个问题 - 假或没有得到存储,以便再次调用查询,并且memoizable更好地使用缓存(即使用它!).

但是我看到memoizable在rails 3.1中被弃用了.我在运载波下使用github并使用语句:"DEPRECATION WARNING:不推荐使用ActiveSupport :: Memoizable,并且将在以后的版本中删除,只需使用Ruby memoization模式.(来自extend at /Users/kain/.rvm/gems/ruby-1.9.3-preview1/bundler/gems/carrierwave-c4459179b0f8/lib/carrierwave/mount.rb:284" .

也许它已经解决了?谁知道?

关于最佳实践的任何建议?使用|| =语法?上述问题怎么样?

在此输入图像描述

tad*_*man 7

||=方法非常适用于返回值为true的值的东西,但对于没有返回值的东西,它不能很好地工作.memoize通过捕获这些条件并相应地返回来解决这个问题.如果你想要适应,你可以采取这样的方法nil:

def some_method
  return @some_method if (instance_variable_defined?(:"@some_method"))

  @some_method = begin
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

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

我不确定你为什么认为它被弃用[来自Michael的注释,它在3.2中被弃用,见下面的注释].该文件表明,它仍然在3.1电流.有时实现在从一个模块移动到另一个模块时被标记为"已弃用",但该工具仍然可用.

  • 自2010年起不推荐使用:http://guides.rubyonrails.org/3_2_release_notes.html#activesupport_deprecations (3认同)