提问人:raquelhortab 提问时间:9/28/2022 更新时间:9/28/2022 访问量:414
在before_destroy中更新记录并防止其销毁
Update record in before_destroy and prevent its destruction
问:
我使用的是 Rails 3.2,Ruby 1.9.3。
我需要防止记录被破坏并在回调中更新它。before_destroy
给定两个具有以下关联的类
class Course:
has_many :attendants
...
class Attendant:
belongs_to :course
before_destroy :dont_really_destroy
...
我在 Attendant 中收到回调:before_destroy
def dont_really_destroy
update_attribute :deleted_at, Time.now
false
end
实际上,当我调用 destroy 方法时,回调确实阻止了删除。但是,记录不会更新。这似乎是合理的,因为我返回 false,我可能会中止任何更新(我也尝试过)。但是,不知何故,当通过设置表单元素从其关联(课程)表单中“销毁”随从记录时,它确实按预期工作。记录已正确更新为 set,而不是销毁。update_column
_destroy
deteled_at
我尝试调试以查看当我尝试从课程表单销毁与直接销毁服务员时实例是否不同,但我看不到任何差异。
当我通过课程表格进行操作时,记录会像这样更新:
course.assign_attributes(params[:course], :without_protection => true)
...
course.save
答:
1赞
Amol Mohite
9/28/2022
#1
嗨,与其在这里使用,不如简单地更新动作呢?callbacks
destroy
#AttendantsController.rb
def destroy
update_attribute :deleted_at, Time.now
head :ok
end
模型中的默认范围
class Attendant:
belongs_to :course
default_scope -> { where(deleted_at: nil) }
...
希望这对你有所帮助。
评论
0赞
raquelhortab
9/28/2022
是的,这确实是一个很好的解决方法。知道为什么它在通过课程关联更新时会起作用,但要进行销毁操作吗?即使我找到了解决问题的另一种方法,也很高兴知道回调行为如下的原因
0赞
Amol Mohite
9/28/2022
将键添加到属性哈希时,将销毁关联的模型,但在保存父模型之前不会销毁该模型。请看一遍这份文件,api.rubyonrails.org/v4.0.1/classes/ActiveRecord/......_destroy
0赞
raquelhortab
9/28/2022
我明白了,虽然它不能完全解决我的问题。父母得救了,孩子没有被摧毁(我猜是因为虚假的回报)。是因为它分两个阶段进行吗?它首先进入回调并更新,等待父级的 save 进行真正的销毁,执行 save 时不会被销毁,因为回调返回 false?我认为,如果它与直接销毁记录的工作方式不同,那么这不是一种一致的行为
0赞
oldmanowl
9/28/2022
#2
您还可以使用 ActAsParanoid Gem,它引入了 rails 的软删除功能。https://github.com/ActsAsParanoid/acts_as_paranoid
评论
0赞
raquelhortab
9/29/2022
谢谢,尽管如果有解决方法,添加整个依赖项似乎没有必要
评论