Модификация сквозной модели Rails при создании - PullRequest
0 голосов
/ 19 июня 2019

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

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

Но не повезло.Предположительно, «запись» еще не существует, что не поможет.Мне также было интересно узнать об удалении и воссоздании ссылки в обратном порядке после сохранения, но мне нужно будет выполнить некоторые сложные проверки в зависимости от метки и содержимого записей, так что это может быть сложно.

У кого-нибудь есть предложения?

1 Ответ

0 голосов
/ 19 июня 2019

В конце концов, более простым решением было удалить accepts_nested_attributes_for из Record, а внешнему приложению сделать отдельную запись в record_associations_controller для создания взаимосвязи.Затем обе записи уже существуют, и их идентификаторы могут быть предоставлены в любом порядке, который предпочитает пользователь.

...