如何在Ruby中声明一个类实例变量?

时间:2014-02-07 14:04:51

标签: ruby-on-rails ruby refactoring class-variables class-instance-variables

我需要一个不会继承的类变量,所以我决定使用一个类实例变量。目前我有这段代码:

class A
  def self.symbols
    history_symbols
  end

  private

  def self.history_tables
    @@history_tables ||= ActiveRecord::Base.connection.tables.select do |x|
      x.starts_with?(SOME_PREFIX)
    end
  end

  def self.history_symbols
    Rails.cache.fetch('history_symbols', expires_in: 10.minutes) do
      history_tables.map { |x| x.sub(SOME_PREFIX, '') }
    end
  end
end

我可以安全地将@@ history_tables转换为@history_tables而不会制动任何东西吗?目前我的所有测试都通过了,但我仍然不确定是否可以这样做。

1 个答案:

答案 0 :(得分:1)

由于您希望使用实例变量,因此您应使用该类的实例,而不是单例方法:

class A
  def symbols
    history_symbols    
  end

  private

  def history_tables
    @history_tables ||= ActiveRecord::Base.connection.tables.select do |x|
      x.starts_with?(SOME_PREFIX)
    end
  end

  def history_symbols
    Rails.cache.fetch('history_symbols', expires_in: 10.minutes) do
      history_tables.map { |x| x.sub(SOME_PREFIX, '') }
    end
  end
end

A.new.symbols

而不是:

A.symbols