Я не уверен, какой заголовок будет наиболее полезным для этого вопроса, но вот сценарий.Модель в моем приложении может ссылаться на другие примеры сама по себе через сквозную модель:
class Record < ApplicationRecord
has_many :record_associations
has_many :linked_records, through: :record_associations
has_many :references, foreign_key: :linked_record_id, class_name: 'RecordAssociation'
has_many :linking_records, through: :references, source: :record
accepts_nested_attributes_for :record_associations, allow_destroy: true
end
class RecordAssociation < ApplicationRecord
belongs_to :record
belongs_to :linked_record, :class_name => 'Record'
belongs_to :label
end
class Label < ApplicationRecord
has_many :record_associations
end
Таким образом, эта модель является направленной, каждая запись имеет много связанных элементов, ссылок и так далее.Метки должны отражать это, например, «запись A заменяет запись B», «запись B is_replaced_by запись A» и т. Д.Один из способов сделать это - иметь две метки, как в приведенном выше примере, другой - только иметь одну ссылку «А заменяет В» и при просмотре Б искать ссылки на нее, чтобы узнать, что она заменена наA.
Это последнее решение, которое я бы предпочел, но это поднимает вопрос о том, как заставить его работать с контроллерами.Поскольку это приложение только для API, я могу создать запись, опубликовав такие параметры, как:
{record: {
name: 'example',
record_association_attributes: {
linked_record_id: 1,
label_id: 2
}
}}.to_json
Но, если метка указывает, что запись и connected_record должны быть наоборот, как я могусоздать это?Я думал о том, чтобы пройти через дополнительный виртуальный атрибут в record_association (например, _reverse), который, если он будет указан, будет делать что-то подобное в RecordAssociation:
before_validation :swap_links
def swap_links
if _reverse == 1
record, linked_record = linked_record, record
end
end
Но не повезло.Предположительно, «запись» еще не существует, что не поможет.Мне также было интересно узнать об удалении и воссоздании ссылки в обратном порядке после сохранения, но мне нужно будет выполнить некоторые сложные проверки в зависимости от метки и содержимого записей, так что это может быть сложно.
У кого-нибудь есть предложения?