使用acts_as_paranoid恢复客户时关联记录未恢复的问题
解决acts_as_paranoid恢复客户时关联记录未恢复的问题
嘿,这个坑我之前踩过!acts_as_paranoid 默认不会自动处理关联记录的软删除与恢复,得咱们手动配置关联模型和恢复逻辑才行,我给你梳理下关键步骤:
1. 确保关联模型也启用软删除
首先,你的 Purchase 和 Payment 模型必须也加上 acts_as_paranoid,不然删除客户时关联记录可能被硬删除(或者根本没被标记为软删),自然恢复不了:
# app/models/purchase.rb class Purchase < ApplicationRecord acts_as_paranoid belongs_to :client end # app/models/payment.rb class Payment < ApplicationRecord acts_as_paranoid belongs_to :client end
2. 配置客户模型的关联依赖
在 Client 模型的关联里,一定要用 dependent: :destroy,这样删除客户时,关联的采购和支付记录会触发软删除(而不是硬删除):
# app/models/client.rb class Client < ApplicationRecord acts_as_paranoid has_many :purchases, dependent: :destroy has_many :payments, dependent: :destroy end
⚠️ 别用 dependent: :delete,这会直接硬删关联记录,再也找不回来!
3. 恢复时使用递归选项
默认调用 client.restore 只会恢复客户本身,要把关联记录一起恢复,得加上 recursive: true 参数:
# 恢复客户及所有关联的采购、支付记录 client = Client.only_deleted.find(params[:id]) client.restore(recursive: true)
额外检查点
- 恢复后查询关联记录时,默认的
client.purchases会自动排除软删记录,所以只要关联记录被成功恢复(deleted_at字段置为nil),就能正常查到。 - 如果还是看不到,排查下是不是查询时不小心用了
only_deleted或者其他过滤条件,或者检查数据库里关联记录的deleted_at字段是否确实被清空了。
内容的提问来源于stack exchange,提问作者Jeremy Thomas
相关产品推荐
相关产品推荐

