Как я могу модульную модель Rails? - PullRequest
2 голосов
/ 14 марта 2012

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

Сначала я пытаюсь найти ответ на вопрос "Где хранить такие классы?"здесь, и ответ был apps/models каталог.Это нормально, но мне нравится четко отделять эти классы от наследуемых классов ActiveRecord в иерархии как в виде файла, так и в классе.

Итак, я создал классы внутри модуля Logic, например Logic::EvaluationLogic или Logic::PhaseLogic.Я также хотел иметь константы, которые передаются между этими логиками.Я предпочитаю также помещать эти константы в модуль Logic.Таким образом, я реализовал так:

# in logic/phase_logic.rb
module Logic
  PHASE_INITIAL = 0
  PHASE_MIDDLE  = 1000

  class PhaseLogic
    def self.some_phase_control_code
    end
  end
end

# in logic/evaluation_logic.rb
module Logic
  class EvaluationLogic
    def self.some_other_code
      Logic::PhaseLogic.self.some_phase_control_code(Logic::PHASE_INITIAL)
    end
  end
end

Теперь он отлично работает с rspec (он проходит тесты, которые я написал без проблем), но не с сервером разработки, так как не может найти Logic::PHASE_INITIAL константа.

Я подозреваю, что это связано с несоответствием схемы автозагрузки Rails и тем, что я хотел сделать.Я пытался настроить рельсы, но не повезло, в итоге я удалил module Logic wrap.

Теперь я хочу задать вопрос: как я могу организовать эти классы с помощью Rails?В данный момент я использую 3.2.1.

Написал дополнительный вопрос " Как мне организовать пространство имен классов в приложении / модулях с помощью rails? "

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Я не уверен, действительно ли я понимаю ваши классы, но вы не могли бы создать модуль Logic или (я бы предпочел сделать это:) PhaseLogic и EvaluationLogic объекты в /lib каталоге ?

Не сказано, что «Модель» всегда является потомком ActiveRecord. Если объект относится к «бизнес-логике», то это модель. У вас могут быть модели, которые никак не касаются базы данных. Поэтому, если ваши классы являются «бизнес-объектами», поместите их в «app / models» и используйте как любую другую модель.

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

Поскольку в Ruby класс объекта не важен, вам не нужно использовать наследование. Если вы хотите «вставить» логические объекты в другие объекты, просто позаботьтесь о том, чтобы у всех классов «* Logic» были необходимые методы. Я знаю, что все, что я сказал, очень расплывчато, но я думаю, что не могу дать вам более конкретных предложений, не зная больше о роли этих объектов.

Ах, и еще одна вещь!

Если вы столкнулись с автозагрузкой классов Rails, просто используйте старый require "lib/logic.rb" во всех классах, где вы используете Logic::PHASE_INITIAL константы.

В этом случае я полагаю, что ваша проблема была вызвана другим порядком загрузки. logic/evaluation_logic.rb был загружен до logic/phase_logic.rb. Проблема может исчезнуть, если вы создадите logic.rb где-нибудь, где автозагрузка класса сможет найти его, и определите эти константы в этом файле.

0 голосов
/ 14 марта 2012

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

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