Как мне моделировать разные типы документов?

Я создаю Ruby On Rails API, который помогает управлять строительными документами - существует целый ряд различных типов документов, каждый из которых имеет разные поля, поэтому в настоящее время у меня есть модель для каждого из них.

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

class Drawing < ApplicationRecord
  ...

  has_many :associated_documents

Где все, что мне нужно, это имя, идентификатор и тип связанных документов (по сути, чтобы можно было легко перемещаться между соответствующими документами в интерфейсе)

Это вариант использования для наследования одной таблицы? Есть ли способ сделать это с помощью полиморфных ассоциаций? Поскольку сценарий использования внешнего интерфейса представляет собой список ссылок, следует ли просто хранить ссылки?

1 ответ

Учитывая, что у вас есть отношение M:M, где могут быть связаны произвольные классы (документы), я думаю, вы бы взглянули на двустороннюю полиморфную ассоциацию.

Вы могли бы иметь DocumentAssociation класс, что-то вроде:

# == Schema Information
#
# Table name: document_associations
#
#  id                         :integer          not null, primary key
#  base_document_type         :string
#  base_document_id           :integer
#  associated_document_type   :string
#  associated_document_id     :integer
#  created_at                 :datetime         not null
#  updated_at                 :datetime         not null
#
class DocumentAssociation < ApplicationRecord
  belongs_to :base_document,        polymorphic: true
  belongs_to :associated_document,  polymorphic: true
end

А потом что-то вроде:

class Drawing < ApplicationRecord
  has_many :base_document_associations, class_name: 'DocumentAssociation', as: :base_document
  has_many :associated_documents, through: :base_document_associations
end

Это, вероятно, правильно с точки зрения направления, но, скорее всего, вам придётся поиграть. Вам также нужно будет сделать некоторые дополнительные подъемы, если вы хотите иметь возможность перемещаться в обоих направлениях (т. Е. Для данного чертежа вам нужны все ассоциации, где этот чертеж является одновременно base_document и related_document).