2009-11-02 3 views
7

Я создаю модуль отправки сообщений. Он будет обрабатывать сообщения о очередности из запроса, который будет подхвачен фоновым работником для отправки электронной почты/SMS (или журнала для тестирования).Rails: Когда модель? Когда lib?

Вопрос: это модель (под/приложение/модели) или lib (под/lib).

Я бы хотел, чтобы на этой религии была какая-то религия.

Теория A: (Моя нынешняя теория) Если вы не подклассифицируете ActionMailer :: Base или ActiveRecord :: Base и т. Д., Ваш код должен войти в lib.

Теория B: (Теория, к которой я склоняюсь) Вещи, которые специфичны для приложения, должны быть в модели. Все, что может быть общего использования, должно быть в lib.

Теория C: только модели данных должны быть в «моделях». Однако подклассы ActionMailer нарушают это правило.

Насколько я знаю, в любом случае это будет нормально работать, но я ищу любые тонкие функциональные или философские причины для одного и другого.

Мысли?

+0

Я согласен с вами: если он не наследуется от ActiveRecord и co., Он не должен быть моделью. Мне нечего сказать, чтобы превратить это мнение в полный ответ. ^^ – marcgg

ответ

5

Независимо от того, наследуются ли сообщения от ActiveRecord или ActionMailer, вероятно, вам нужна модель для любых объектов, с которыми взаимодействуют ваши представления и контроллеры. В вашем случае они будут обрабатывать экземпляры класса Message - вам нужна модель для этого.

Что касается модуля отправки сообщений - извлечение из библиотеки отлично, если вы планируете повторно использовать код в другом месте, где вы можете просто включить модуль в любой класс.

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

+0

Как вы думаете, эта карта для Теории B выше? –

+0

Да, ваша теория B верна. Однако в большинстве случаев вам все еще нужна модель для чего-то, что не может быть специфичным для приложения. Возьмем, например, класс Message. Да, вы можете взаимодействовать с сообщениями в нескольких разных приложениях одинаково, но почти всегда будут случаи, когда вы захотите переопределить или настроить поведение сообщения для каждого приложения. Итак, создайте модель во всех приложениях и включите lib (s). – bensie

2

Возможно, вам стоит подумать больше о базовом бизнесе. Модели, как следует из их названия, здесь представляют (моделируют) некоторую реальную систему или процесс. Итак, правило большого пальца должно быть таким: Является ли этот объект какой-либо ролью в системе, которую я пытаюсь выразить в своем приложении? Если ответ положительный, субъект является хорошим кандидатом на то, чтобы быть моделью. Тем не менее, было бы прекрасно реализовать основные функции вашего модуля обмена сообщениями в отдельной библиотеке для последующего повторного использования и просто включить его в модель.

+0

Считаете ли вы эту карту Теорией B выше? –

1

Мне нравится теория «Модель данных», и я стараюсь придерживаться ее, когда могу, но я думаю, что у Бенси и Милана есть правильная идея. Если у вас есть виды и контроллеры, связанные с ним, это должно быть с моделями. Если вы ссылаетесь только на функциональность из другого класса, поместите его в lib.