Я пытаюсь СУХОЙ мой код, внедряя модули. Тем не менее, у меня есть константы, хранящиеся в моделях (а не в модуле), с которыми я пытаюсь получить доступ с помощью self.class.Класс возвращаемого модуля вместо класса модели с self.class Ruby/Rails
Вот (я надеюсь) соответствующие фрагменты:
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"
While если я помещу его в класс армии, он найдет соответствующую константу.
Я считаю, что это потому, что я не правильно просматриваю self.constant_get. Я хотел бы оставить рассматриваемый метод в модуле, так как другим моделям необходимо запустить метод, ссылающийся на их собственные константы TH_LEVEL.
Как я могу это сделать?
Я считаю, что для каждой модели я должен добавить метод класса self.my_th_level, включая модуль DarkElixir. Я надеюсь динамически добавлять метод ко всем моделям через модуль. – BrantDFaulkner
Но вы сказали: «Другие модели должны запускать метод, ссылающийся на собственные константы TH_LEVEL». Так вы пытаетесь сделать «th_level» (константа или метод, не имеет значения) конкретными для каждого класса или одинаковыми для каждого класса, который включает ваш модуль DarkElixir? – EugZol
, не получив ответа на ваш комментарий ... – BrantDFaulkner