问题:尽可能避免创建多个对象或多个查询。
我正在使用带有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"
也许它已经解决了?有人知道吗?
有关今后使用的最佳做法的任何建议吗?使用|| =语法?上述问题怎么样?
答案 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中仍然是最新的。有些实现在从一个模块移动到另一个模块时被标记为“已弃用”,但该工具仍然可用。