使用 rails 演示者 - 可记忆化在 3.1 中被弃用 - 使用 ||= 代替?

Posted

技术标签:

【中文标题】使用 rails 演示者 - 可记忆化在 3.1 中被弃用 - 使用 ||= 代替?【英文标题】:Using rails presenters - memoizable getting deprecated in 3.1 - use ||= instead? 【发布时间】:2011-12-17 07:32:12 【问题描述】:

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

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

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

但是我发现在 rails 3.1 中 memoizable 已被弃用 注意我在carrierwave下的github和声明: “弃用警告:ActiveSupport::Memoizable 已弃用,将在未来的版本中删除,只需使用 Ruby 备忘录模式即可。(从 /Users/kain/.rvm/gems/ruby-1.9.3-preview1/bundler/ 的扩展调用gems/carrierwave-c4459179b0f8/lib/carrierwave/mount.rb:284"。

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

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

【问题讨论】:

【参考方案1】:

||= 方法非常适用于返回值为 true 的值,但它不适用于返回值为 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 中仍然是最新的。有时,在将实现从一个模块移动到另一个模块时,它们会被标记为“已弃用”,但该工具仍然可用。

【讨论】:

好吧,我环顾四周,也许旧的实现已被弃用。无论如何,我会选择 Memoizable 现在我知道我可以依靠 3.1 Thx tadman! 等一下,我找到了警告,这是关于演示者和备忘的优秀 railsbest 课程。它们以“僵尸铁路”课程而闻名。无论如何,他们提供了有关记忆的信息,说 ActiveSupport 选项是最好的,但他们的实际代码挑战说“ActiveSupport::Memoizable(注意:ActiveSupport::Memoizable 在 Rails 3.1 中已弃用)”!所以仍然不确定,如果它被弃用是因为上述问题将得到解决,等等。 自 3.2 起已弃用:guides.rubyonrails.org/…

以上是关于使用 rails 演示者 - 可记忆化在 3.1 中被弃用 - 使用 ||= 代替?的主要内容,如果未能解决你的问题,请参考以下文章

记忆化在这里有啥帮助?

Ruby on Rails 模式 - 装饰器与演示器

使用 Rspec 测试 Rails 3.1 可安装引擎

如何使用设计:可记忆?

Rails 3.1 资产管道供应商/资产文件夹组织

记忆有啥好处,真的那么有用吗?