2015-08-04 2 views
1

Я пытаюсь СУХОЙ мой код, внедряя модули. Тем не менее, у меня есть константы, хранящиеся в моделях (а не в модуле), с которыми я пытаюсь получить доступ с помощью 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.

Как я могу это сделать?

ответ

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 
+0

Я считаю, что для каждой модели я должен добавить метод класса self.my_th_level, включая модуль DarkElixir. Я надеюсь динамически добавлять метод ко всем моделям через модуль. – BrantDFaulkner

+0

Но вы сказали: «Другие модели должны запускать метод, ссылающийся на собственные константы TH_LEVEL». Так вы пытаетесь сделать «th_level» (константа или метод, не имеет значения) конкретными для каждого класса или одинаковыми для каждого класса, который включает ваш модуль DarkElixir? – EugZol

+0

, не получив ответа на ваш комментарий ... – BrantDFaulkner

1

Ugh. В рассматриваемом методе используются две константы. Это была вторая константа, которая срабатывала, а не первая. Добавлен «self.class ::» до второй константы - назад в бизнес.

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 
Смежные вопросы