activerecord - Papertrail 轨道通过关联创建但不删除
问题描述
我有一个行业表,并且正在跟踪它的竞争对手,这些竞争对手也是行业。这是通过具有行业 ID 和竞争者 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
每次通过整个竞争对手名单。如果我尝试将一些竞争对手(通过不将 id 传递给控制器)与行业分离,则会触发“删除”查询。
DELETE FROM `industry_competitors` WHERE `industry_competitors`.`industry_id` = 4559 AND `industry_competitors`.`competitor_id` = 4564
我怀疑是因为 activerecord 调用“删除”而不是“销毁”,所以不会触发此 papertrail 回调,因此不会跟踪更改。如果有办法显式调用删除(代码更改最少)。或者有没有办法让 papertrail 跟踪删除?
解决方案
添加这个补丁可以让它工作。
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
推荐阅读
- node.js - 使用 MongoDB 的 NodeJS 嵌套组聚合
- qt - 在 QML 中使用 Brython
- python - 循环输入直到满足参数或用户输入
- c# - Json.NET TypeNameHandling 和 TypeNameAssemblyFormatHandling
- java - 创建包含收件人、主题、正文和附件的电子邮件
- c# - Unity 中的 C#:在不阻塞主线程的情况下调用 Promise 风格的异步方法
- ubuntu - Anki 上的 LATEX 无法正常显示;Ubuntu 18.10
- c# - 如果 2 个图像匹配,如何使 2 个图片框不可见
- java - 根据条件在jsp forloop中隐藏div标签
- c# - 多级属性的 nameof() 运算符