Как мне моделировать разные типы документов?
Я создаю 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).