2013-07-02 2 views
0

У меня есть модель Identity, в которой много types (скажем, student, teacher). Каждый из этих типов имеет множество уникальных методов, определенных в разных модулях, а также множество общих методов.Включить модули в зависимости от типа мгновенного действия

Я хотел бы включить определенные модули в зависимости от мгновенных типов, чтобы избежать конфликта имен. Что-то вроде:

class Identity < ActiveRecord::Base 
if instant.type =='student' 
    include Student 
if instant.type == 'teacher' 
    include Teacher 
end 
end 

Как мне это сделать?

+2

Почему бы просто не наследовать классы учеников и учителей от Identity? –

+0

Я согласен с Иваном, если сущность не может быть ОБОИХ учителем и учеником, вам лучше использовать STI - http://blog.thirst.co/post/14885390861/rails-single-table-inheritance – house9

+0

Спасибо, Иван и house9. ИППП является разумным вариантом. К сожалению, у меня есть большой код устаревшего кода, который, скорее всего, сломается, если будет преобразован в STI (например, сложный ключевой камень, который я использовал, может сломать индексирование). – AdamNYC

ответ

1

Вы можете использовать после инициализации крюка для загрузки правильного модуля.

def after_initialize 
if self.type =='student' 
    extend Student 
else if self.type == 'teacher' 
    extend Teacher 
end 
end 

Но вы должны убедиться, что вы всегда инициализируете свой объект типом, чтобы избежать неожиданных результатов.

+0

Спасибо Vimsha. Я попробовал ваше решение, но оно не сработало. Был ли он протестирован? – AdamNYC

+0

Произведено редактирование. Попробуй это. Я использовал это в одном из моих проектов. Поэтому я уверен, что он должен работать – usha

+0

Hi Vimsha, в моем случае, Student and Teacher - это модули, а не классы. Интересно, будет ли это работать. – AdamNYC