Следы Papertrail создают, но не удаляют через ассоциацию - PullRequest
0 голосов
/ 10 октября 2018

У меня есть таблица отраслей и я отслеживаю ее конкурентов, которые также являются отраслями.Это через таблицу сопоставления industry_competitors, в которой присутствуют industry_id и Competitor_id.Я хочу, чтобы papertrail отслеживал ассоциации и диссоциации отраслевых конкурентов.

class Industry < ApplicationRecord
  has_many :industry_competitors, dependent: :destroy
  has_many :competitors, through: :industry_competitors
end


class IndustryCompetitor < ApplicationRecord
  has_paper_trail
  belongs_to :industry
  belongs_to :competitor, class_name: "Industry"
end

Код моего контроллера как таковой.

  competitors = ::Industry.where(id: params[:competitor_ids])
  @industry.competitors = competitors
  @industry.save

Каждый раз, когда передается весь список конкурентов.Если я пытаюсь отсоединить нескольких конкурентов (не передавая идентификаторы контроллеру) из отрасли, запускается запрос «Удалить».

  DELETE FROM `industry_competitors` WHERE `industry_competitors`.`industry_id` = 4559 AND `industry_competitors`.`competitor_id` = 4564

Я подозреваю, потому что activerecord вызывает «удалять», а не «уничтожать»«обратные вызовы этой бумажной трассы не запускаются, поэтому изменения не отслеживаются.Если есть способ вызвать удалить явно (с минимальными изменениями кода).Или есть ли способ для бумажного следа отслеживать удаление?

1 Ответ

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

Добавление этого патча может заставить его работать.

module HasManyThroughAssociationPatch
  def delete_records(records, method)
    method ||= :destroy
    super
  end
end

ActiveRecord::Associations::HasManyThroughAssociation.prepend(HasManyThroughAssociationPatch)

Кредиты: https://github.com/westonganger/paper_trail-association_tracking

...