我试图使用acts_as_paranoid宝石,但没有运气。 我有一个Client
模型:
class Client < ActiveRecord::Base
acts_as_paranoid
has_many :purchases, dependent: :destroy
has_many :payments, dependent: :destroy
end
当我用购买和/或付款摧毁客户,然后尝试恢复时,只恢复了客户,而不是关联。
> c = Client.find(231)
> c.payments.length
Payment Load (0.6ms) SELECT "payments".* FROM "payments" WHERE "payments"."client_id" = $1 [["client_id", 231]]
=> 1
> c.purchases.length
Purchase Load (0.6ms) SELECT "purchases".* FROM "purchases" WHERE "purchases"."client_id" = $1 [["client_id", 231]]
=> 1
如果我删除客户端:
> c.destroy
并运行Client.only_deleted
,我看到刚刚删除的客户端。 但是,当我恢复它并尝试加载购买或付款时,没有。
> Client.only_deleted.first.recover
> c = Client.find(231) # success
> c.payments.length # fail
=> 0
不会恢复关联的记录。 我错过了什么吗?
意识到我需要运行:
bin/rails generate migration AddDeletedAtToControllerName deleted_at:datetime:index
对于所有关联的模型,并添加:
acts_as_paranoid
到模型的也是如此。 添加后,一切都按预期运行
发生这种情况的原因是因为 acts_as_paranoid
覆盖了 ruby 类的 destroy
方法。这意味着与dependent: :destroy
的关联将像未在类上定义acts_as_paranoid
时的行为相同,并且实际上会删除关联的记录。
因此,对于要防止永久删除的每个关联和从属记录,是的,您需要确保这些记录也具有acts_as_paranoid
功能。
表示所有相关模型并添加: act_as_paranoid
class Purchase < ActiveRecord::Base
acts_as_paranoid
end
class Payment < ActiveRecord::Base
acts_as_paranoid
end
在这种情况下 c = Client.find(231)
, c.destroy
它可以在删除案例时正常工作,但是当您恢复该记录时,也不会从关联的记录中恢复任何内容。如果要从要使用act_as_paranoid软删除的模型中删除依赖项::d estroy。
class Client < ActiveRecord::Base
acts_as_paranoid
has_many :purchases
has_many :payments
end
这将为您工作。因为 ruby 类的销毁方法。这意味着与 dependent 的关联::d estroy 的行为将与未在类上定义acts_as_paranoid时的行为相同,并且实际上会删除关联的记录。