Могу ли я использовать 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:-

  1. Создать базовый класс
  2. Наряду с необходимыми атрибутами добавьте атрибут:type в виде строки в базовый класс
  3. Создать любые необходимые классы-потомки

Недостатки ИППП

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

НАДЕЮСЬ, ПОМОЖЕТ:)

Другие вопросы по тегам