使用self.class Ruby / Rails返回模块类而不是模型类

时间:2015-08-04 21:45:19

标签: ruby-on-rails ruby module constants self

我试图通过实施模块来干我的代码。但是,我有一些常量存储在我尝试使用self.class访问的模型(而不是模块)中。

以下是(我希望)相关的片段:

module Conversion
  def constant(name_str)
    self.class.const_get(name_str.upcase)
  end
end

module DarkElixir
  def dark_elixir(th_level)
    structure.map { |name_str| structure_dark_elixir(name_str, th_level) if constant(name_str)[0][:dark_elixir_cost] }.compact.reduce(:+)
  end
end

class Army < ActiveRecord::Base
  include Conversion, DarkElixir

  TH_LEVEL = [...]
end

def structure_dark_elixir(name_str, th_level)
  name_sym = name_str.to_sym
  Array(0..send(name_sym)).map { |level| constant(name_str)[level][:dark_elixir_cost] }.reduce(:+) * TH_LEVEL[th_level][sym_qty(name)]
end

当我将structure_dark_elixir方法放在DarkElixir模块中时,我收到一个错误,“未初始化的常量DarkElixir :: TH_LEVEL”

如果我把它放在陆军类中,它会找到合适的常数。

我相信这是因为我没有正确地确定self.constant_get。我想在模块中保留有问题的方法,因为其他模型需要运行引用它们自己的TH_LEVEL常量的方法。

我怎么能做到这一点?

2 个答案:

答案 0 :(得分:1)

为什么不直接使用类方法?

module DarkElixir
  def dark_elixir(th_level)
    # simplified example
    th_level * self.class.my_th_level
  end
end

class Army < ActiveRecord::Base
  include DarkElixir

  def self.my_th_level
    5
  end
end

答案 1 :(得分:1)

唉。有问题的方法使用两个常量。这是绊倒的第二个常数,而不是第一个。添加&#34; self.class ::&#34;在第二个常数之前 - 回到商业中。

def structure_dark_elixir(name_str, th_lvl)
  name_sym = name_str.to_sym
  Array(0..send(name_sym)).map { |level| constant(name_str)[level][:dark_elixir_cost] }.reduce(:+) * self.class::TH_LEVEL[th_lvl][sym_qty(name_str)]
end