【问题标题】:Using rails presenters - memoizable getting deprecated in 3.1 - use ||= instead?使用 rails 演示者 - 可记忆化在 3.1 中被弃用 - 使用 ||= 代替?
【发布时间】: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"。

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

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

【问题讨论】:

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


    【解决方案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/…
    猜你喜欢
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多