2009-10-28 3 views
2

Я начинаю реализовывать решение MTI и задаю основной вопрос. У меня есть 3 физических модели - SMSNotifications, EmailNotifications, TwitterNotifications, и они являются подклассами уведомления. Иногда в моем коде я хочу сказать Notifications.find(:all), чтобы получить набор результатов, отсортированных по времени их создания. Затем я хочу делать вещи на основе их подкласса. Как писать Notifications.find(:all) и просматривать Rails через таблицы подкласса и комбинировать результаты? Прямо сейчас Rails все еще думает, что у меня есть таблица физических уведомлений, которая противоречит моей конструкции MTI.Rails Множественный вопрос о наследовании таблицы

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

Спасибо!

ответ

1

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

+0

еще раз спасибо за ваш ответ микрофона. Я думаю, что STI будет работать лучше. пытаясь сейчас ... – Tony

0

С этой целью вы можете сделать подклассы полиморфной связью с определенной моделью (X). Вы можете отредактировать обратный вызов after_initialize, чтобы связать одну запись этой конкретной модели X с каждым из ваших подклассов при создании. Таким образом, вы можете выполнить поиск на цели (X) указанной полиморфной ассоциации.

0

Недавно я разработал многообещающий проект для реализации множественного наследования таблиц и наследования классов в Rails. Я провел несколько дней, подвергая его быстрой разработке, исправлениям, комментариям и документации и повторно выпустил его как наследование класса CITIER и наследование наследования для Rails.

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

Notification.all().each do |n| 
    if n.class == 'EmailNotification' 
    #Do something 
    end 
end 

Или даже определить функцию в классе Notification корня и перегрузить его в подклассах, чтобы вернуть что-то другое.

Рассмотрим придав ему вид: http://peterhamilton.github.com/citier

Я нахожу это так полезно! Я бы (кстати) приветствовал любую помощь для сообщества в вопросах и тестировании, очистке кода и т. Д.! Я знаю, это то, что многие люди оценят.

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

1

Если вы используете https://github.com/hzamani/acts_as_relation:

rails g model notification notification_type:string notification_id:integer <other columns> 
rails g model email_notification <columns> 

class EmailNotification < ActiveRecord::Base 
    acts_as :notification 
end 
.... 

то код, который вы хотите, может быть что-то вроде этого:

Notification.all.each do |n| 
    case n.notification_type 
    when "EmailNotification" 
    ... 
    when "SMSNotification" 
    ... 
    end 
end