在ruby中,我怎么知道memoist方法在做什么?

时间:2015-03-30 21:22:37

标签: ruby-on-rails ruby

我现在正在开发基于健康数据标准库(https://github.com/projectcypress/health-data-standards.git)的开发。在文件lib / health-data-standards / export / helper / scooped_view_helper.rb(https://github.com/projectcypress/health-data-standards/blob/master/lib/health-data-standards/export/helper/scooped_view_helper.rb)第90行中,调用patient.entries_for_oid。但是这个方法没有定义。

在Pry环境下,我试过了#34;编辑patient.entries_for_oid"。编辑在第166行打开memoist / lib / memoist.rb(https://github.com/matthewrudy/memoist/blob/master/lib/memoist.rb)。在那里我看到了这些代码:

          module_eval <<-EOS, __FILE__, __LINE__ + 1
        def #{method_name}(*args)
          reload = Memoist.extract_reload!(method(#{unmemoized_method.inspect}), args)

          skip_cache = reload || !(instance_variable_defined?(#{memoized_ivar.inspect}) && #{memoized_ivar} && #{memoized_ivar}.has_key?(args))
          set_cache = skip_cache && !frozen?

          if skip_cache
            value = #{unmemoized_method}(*args)
          else
            value = #{memoized_ivar}[args]
          end

          if set_cache
            #{memoized_ivar} ||= {}
            #{memoized_ivar}[args] = value
          end

          value
        end
      EOS
    end

但它没有意义,patient.entries_for_oid真的有用。

任何人都知道吗?

由于

1 个答案:

答案 0 :(得分:0)

该方法在Record模型类上为defined。这样一个类的实例将传递给助手中的entries_for_data_criteria方法。

你不是简单地看到实际的方法源,因为作者选择使用Memoist gem,它可以用来包装任意方法来扩展它们的行为(在这种情况下是缓存,或者更确切地说是memoization)。