Является ли это законным использованием Rails 'Single Table Inheritance? - PullRequest
4 голосов
/ 01 июня 2009

Я только что прочитал блог Чеда Фаулера о 20 Rails Development No-Nos . В отношении наследования отдельных таблиц он комментирует:

Хранение столбца с именем «type», содержащего имя класса, является довольно хорошим показателем того, что происходит что-то подозрительное. Это подозрительно, но не всегда плохо. Я думаю, однако, что каждый раз, когда вы используете его, вы должны спросить себя, не раз ли это правильное решение. Базы данных не делают то, что делают лучше всего, когда у вас много ИППП и полиморфных ассоциаций.

Я пишу приложение для блога и рассматриваю возможность использования STI для комментариев, которые могут быть сделаны к сообщению, и для контактных сообщений, которые посетители могут публиковать, если они хотят связаться со мной. Моя Message модель будет наследоваться от моей Comment модели. Они оба имеют общие атрибуты, за исключением того, что Message будет иметь дополнительное поле subject. Другая распространенность заключается в том, что оба будут отправлены в Akismet для проверки на спам.

Вместо того, чтобы просто несколько раз спросить себя, является ли это правильным решением, как предлагает Чад, я подумал, что также получу некоторые мнения от экспертов по переполнению стека! Похоже ли то, что я предлагаю, на STI?

1 Ответ

2 голосов
/ 02 июня 2009

Я использовал STI несколько раз. Рассмотрим CMS, которая может иметь Page, NewsItem, BlogItem и т. Д.

Каждый из них может происходить из общего класса, который, в свою очередь, наследуется от ActiveRecord. Таблица для каждого из них будет одинаковой (title, body, tags, publ_at), но каждая модель может иметь разные ассоциации, разные статусы или разные рабочие процессы, поэтому у каждого есть свой код в своем собственном классе. Тем не менее все они имеют общую таблицу и родительский класс. Это также позволяет мне использовать родительский класс для перекрестного поиска по классу и автоматически приводить полученный массив записей.

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

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

...