我试图通过实施模块来干我的代码。但是,我有一些常量存储在我尝试使用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常量的方法。
我怎么能做到这一点?
答案 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