我试图使用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
未恢复相关记录。我错过了什么吗?
答案 0 :(得分:0)
我没有意识到我需要跑:
bin/rails generate migration AddDeletedAtToControllerName deleted_at:datetime:index
对于所有相关模型并添加:
acts_as_paranoid
也是模特的。添加后,所有内容都按预期运行
答案 1 :(得分:0)
之所以发生这种情况,是因为acts_as_paranoid
会覆盖ruby类的destroy
方法。这意味着与dependent: :destroy
的关联将与在类上未定义acts_as_paranoid
并且实际上将删除关联记录时的关联一样。
因此,对于您希望阻止永久删除的每个关联和依赖记录,是的,您需要确保这些记录也具有acts_as_paranoid
功能。
答案 2 :(得分:0)
对于所有关联的模型并添加: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 从想要软删除的模型中删除 dependent: :destroy。
class Client < ActiveRecord::Base
acts_as_paranoid
has_many :purchases
has_many :payments
end
这对你有用。 因为 ruby 类的销毁方法。这意味着与dependent::destroy 的关联的行为与类中未定义acts_as_paranoid 时的行为相同,并且实际上会删除关联的记录。