作为偏执狂的行为并没有恢复协会

时间:2018-03-08 18:37:47

标签: ruby-on-rails ruby-on-rails-4 acts-as-paranoid

我试图使用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

未恢复相关记录。我错过了什么吗?

3 个答案:

答案 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 时的行为相同,并且实际上会删除关联的记录。