6

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

我使用带有 Rails 的 Presenters 作为最佳实践。

我遵循的建议说最好使用“扩展 ActiveSupport.Memoizable”(然后 memoize :method(s) 来使用它们)而不是设置具有@the_record = record ||= @record样式的项目,因为有几个问题 - false 或 nil 没有得到存储以便再次调用查询,并且 memoizable 更好地使用缓存(即使用它!)。

但是我看到 memoizable 在 rails 3.1 Notes i github undercarrierwave 和声明中被弃用:“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”。

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

关于未来使用的最佳实践有什么建议吗?使用 ||= 语法?以上问题怎么办?

在此处输入图像描述

4

1 回答 1

7

||=方法非常适合返回评估为 true 的值的事物,但对于不返回值的事物则效果不佳。memoize通过捕获这些条件并相应地返回来解决这个问题。如果你想适应,你可能会采取这样的方法nil

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

  @some_method = begin
    ...
  end
end

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

我不确定您为什么认为它已被弃用[Michael 的注释,它在 3.2 中已被弃用,请参阅下面的注释]。文档表明它在 3.1 中仍然是最新的。有时,当它们从一个模块移动到另一个模块时,实现会被标记为“已弃用”,但该工具仍然可用。

于 2011-10-28T15:34:05.317 回答