Вопрос наследования нескольких таблиц Rails - PullRequest
2 голосов
/ 29 октября 2009

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

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

Спасибо!

Ответы [ 4 ]

1 голос
/ 12 июня 2011

Если вы используете 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
1 голос
/ 29 октября 2009

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

0 голосов
/ 29 апреля 2011

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

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

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

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

Рассмотрите возможность взглянуть на это: http://peterhamilton.github.com/citier

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

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

0 голосов
/ 05 января 2011

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

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