Rails включают в себя несколько классов - PullRequest
0 голосов
/ 05 марта 2019

У меня есть модуль DelayTasks и много классов внутри этого модуля. Я хочу включить еще один модуль DelayedEmails во все классы DelayedTasks, как и первый класс, но только с одним включением. Есть ли способ сделать это?

module DelayedTasks
  class A
    include DelayedEmails
  end

  class B
  end

  class C
  end

  class D
  end
end

Ответы [ 2 ]

2 голосов
/ 05 марта 2019

Кажется, вы должны сделать:

module DelayedTasks

  class Base 
    include DelayedEmails
  end

  class A < Base
  end

  class B < Base
  end

  class C < Base
  end

  class D < Base
  end

end

Кстати, определение нескольких классов внутри одного файла не выглядит хорошей практикой (IMO). Конечно, это работает. Но вы можете в конечном итоге искать, где эти классы определены, тогда как, если они находятся в отдельных файлах, может быть немного более очевидно, где они определены.

0 голосов
/ 05 марта 2019

Решение 1 (Прямое):

module DelayedTasks
  class A
  end

  class B
  end

  class C
  end

  class D
  end
end

DelayedTasks.constants.each do |constant|
  constant.include DelayedEmails if constant.is_a? Class
end

Однако, поскольку файл выше называется построчно, то если есть другой файл, который добавляет больше классов внутри модуля DelayedTasks, и этоэтот файл загружается после вышеприведенного кода, тогда эти классы не будут учитываться вышеприведенным циклом .each, и поэтому они не получат include с DelayedEmails

Альтернативное решение

Если исходить из того, что вы задаете этот вопрос, во избежание включения нескольких модулей во все ваши классы ...

module DelayedTasks
  module Dependencies
    def self.included(base)
      base.include DelayedEmails
      # base.include SomeOtherModule1
      # base.include SomeOtherModule2
      # ...
    end
  end

  class A
    include Dependencies
  end

  class B
    include Dependencies
  end

  class C
    include Dependencies
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...