Могу ли я использовать Single Table Inheritance с has_many, чтобы получить коллекцию нескольких типов
У меня есть класс Citation, и я хочу, чтобы у каждого Citation было много ресурсов. Ресурс может быть LocalFile, Link (и может быть что-то вроде файла dropbox). Ресурсы будут делиться большей функциональностью и колонками. Я хочу использовать наследование одной таблицы следующим образом.
class Resource < ActiveRecord::Base
belongs_to :citation
acts_as_list :scope => :citation
end
class LocalFile < Resource
end
class Link < Resource
end
class Citation < ActiveRecord::Base
has_many :resources, class_name: "Resource"
end
Я хочу быть в состоянии получить коллекцию ресурсов с кодом что-то вроде
cites = mycite.citations
и каждый объект в cites имеет соответствующий тип (LocalFile, Link и т. д.). Будет ли это работать? Как ни странно, несмотря на активные поиски, я не смог найти ответ на этот простой вопрос.
Кроме того, будут ли методы, добавленные act_as_list, работать надлежащим образом при вызове объектов различных подтипов, т. Е. Будут ли перемещать их вверх или вниз в списке по всем ресурсам для одного цитирования
В качестве альтернативы, есть ли лучший способ сделать это? Я хочу, чтобы класс Citation имел коллекцию ресурсов нескольких подтипов. Концептуально каждый тип ресурса способен представлять один и тот же контент, к которому обращаются по-разному.
1 ответ
STI следует учитывать при работе с классами моделей, которые имеют почти одинаковые функциональные возможности и поля данных, но вам, как разработчику, может потребоваться более детальный контроль над расширением или добавлением к каждому классу в отдельности. Вместо того, чтобы дублировать код снова и снова для нескольких таблиц (и не быть сухим), или отказаться от гибкости добавления уникальных функциональных возможностей или методов, STI позволяет вам использовать данные в одной таблице при написании специализированных функций.
для реализации STI:-
- Создать базовый класс
- Наряду с необходимыми атрибутами добавьте атрибут:type в виде строки в базовый класс
- Создать любые необходимые классы-потомки
Недостатки ИППП
STI не всегда лучший выбор дизайна для вашей схемы. Если подклассы, которые вы намереваетесь использовать для STI, имеют много разных полей данных, то включение их всех в одну таблицу приведет к большому количеству нулевых значений и затруднит масштабирование с течением времени. В этом случае у вас может оказаться так много кода в подклассах модели, что общая функциональность между подклассами минимальна и требует отдельных таблиц. Кроме того, как я упоминал выше, STI не следует использовать только потому, что два типа объектов имеют схожие атрибуты - и у самолетов, и у велосипедов есть колеса, но, вероятно, нет смысла группировать их в одну таблицу, учитывая, что они интуитивно Это разные объекты, которые будут иметь совершенно разные функции и поля данных в приложении.
НАДЕЮСЬ, ПОМОЖЕТ:)