0

我正在尝试使用acts_as_paranoid gem,但没有运气。我有一个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

关联的记录不会被恢复。我错过了什么吗?

4

3 回答 3

2

我没有意识到我需要运行:

bin/rails generate migration AddDeletedAtToControllerName deleted_at:datetime:index

对于所有相关模型并添加:

acts_as_paranoid

到模型的为好。添加之后,一切都按预期运行

于 2018-03-08T21:03:35.217 回答
0

发生这种情况的原因是因为acts_as_paranoid覆盖destroy了 ruby​​ 类的方法。这意味着关联的行为与未在类上定义时的dependent: :destroy行为相同,acts_as_paranoid并且实际上会删除关联的记录。

因此,对于您希望防止被永久删除的每条关联和依赖记录,是的,您需要确保这些记录也具有acts_as_paranoid功能。

于 2018-03-09T05:56:35.153 回答
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从要软删除的模型中删除依赖::destroy

class Client < ActiveRecord::Base
  acts_as_paranoid
  has_many :purchases
  has_many :payments
end

这对你有用。因为 ruby​​ 类的销毁方法。这意味着与dependent: :destroy 的关联将与未在类上定义acts_as_paranoid 时的行为相同,并且实际上会删除关联的记录。

于 2021-02-18T18:20:08.283 回答