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

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

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

class Drawing < ApplicationRecord
  ...

  has_many :associated_documents

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

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


comment
Ничего особенного. Но, я бы сказал, используйте полиморфизм.   -  person jvillian    schedule 23.08.2018
comment
какая деталь поможет? Я не совсем понимаю, какой была бы полиморфная ассоциация, если бы, скажем, у меня было 5+ различных типов документов, каждый из которых имел много связанных документов, которые могут быть любого типа.   -  person Aaron Cohen    schedule 23.08.2018
comment
Drawing пример Document? Если да, то какие еще есть документы? Всегда ли ассоциации 1: M? Или они когда-нибудь M: M?   -  person jvillian    schedule 23.08.2018
comment
Да, извините, чертеж - это пример типа документа. Другими типами документов являются Rendering Sketch и ShopDrawing. Всегда много ко многим - данный Drawing (или любой другой тип документа) имеет много связанных документов и, следовательно, может быть связан другим способом со многими другими документами.   -  person Aaron Cohen    schedule 23.08.2018
comment
Возможно, вы захотите рассмотреть возможность наследования нескольких таблиц. Вы храните общие столбцы в одной таблице, а специфические - в отдельной таблице. Или почему бы не рассмотреть хранилище документов без схемы, такое как Mongoid, которое кажется идеально подходящим.   -  person max    schedule 23.08.2018
comment
Я никогда не использовал хранилище без схемы, и поскольку внутри каждого типа документа есть согласованная схема, а остальная часть приложения кажется реляционной (пользователи, проекты, компании, наборы документов и т. Д.), Я бы потерял используя что-то вроде Mongoid? Есть ли хороший ресурс для оценки наилучших вариантов использования?   -  person Aaron Cohen    schedule 23.08.2018


Ответы (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

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

person jvillian    schedule 22.08.2018