我如何找出为什么我不能#destroy()记录?

kra*_*ene 28 activerecord ruby-on-rails

person = Person.find(4123)
person.destroy #=> false
Run Code Online (Sandbox Code Playgroud)

我有哪些方法可以找出记录未被删除的原因?该模型有两个验证,都只在创建时触发.它有一个回调,但如果失败则回调不会阻止.

我没有追溯或错误.

pdo*_*obb 34

我遇到了同样的问题,这就是我为了弄清楚发生了什么而做的事情......

首先,对于我想要销毁的对象的类,我运行它来弄清楚所有关联被设置为dependent: :destroy:

ary = 
  <MyClass>.reflect_on_all_associations.select { |a| 
    a.options[:dependent] == :destroy 
  }.map(&:name)
Run Code Online (Sandbox Code Playgroud)

然后我调用ary了我的对象中命名的每个关联并收集了结果.这会将关联名称限制为仅包含实际具有依赖对象的名称:

ary.select! { |association_name| 
  <my_object>.send(association_name).present? 
}
Run Code Online (Sandbox Code Playgroud)

然后我可以尝试销毁这些关联名称返回的每个对象:

associated_objects = 
  ary.each_with_object([]) { |association_name, acc| 
    acc.concat(<my_object>.send(association_name))
  }

problem_objects =
  associated_objects.select { |obj| obj.destroy; obj.errors.any? }
# ...
Run Code Online (Sandbox Code Playgroud)

我只有一个对象,所以上面的内容足以导致破坏失败.然后,我可以查看未能销毁的对象上的错误:

problem_objects.map(&:errors)
Run Code Online (Sandbox Code Playgroud)

这就是我终于看到导致破坏失败的错误的地方.从那里,它是一个简单的编程问题(SMOP)来解决这个问题.

在我的例子中,有一个before_destroy回调阻止销毁我的一个依赖对象关联.为了使将来调试变得更加简单,我决定在失败的回调中开始将错误记录到Rails日志中(除​​了添加错误消息errors.base).

  • 谢谢,对我帮助很大!就我而言,我只是在“ before_destroy”方法中使用了“ return false”,以防止破坏对象。 (2认同)

小智 6

我已经碰到过几次了,终于遇到一种简单的方法来确定记录未被破坏的原因(在Rails 5.x中进行了测试)。

只需包装销毁电话在急救块中,查看error.record.errors。

begin
  person = Person.find(4123)
  person.destroy! #=> Note the exclamation mark which will cause an error if it fails
rescue ActiveRecord::RecordNotDestroyed => error
  puts "errors that prevented destruction: #{error.record.errors}"
end
Run Code Online (Sandbox Code Playgroud)

  • 除了我需要使用“#{error.record.errors.full_messages}”来显示特定的根本原因之外,这非常有效。 (3认同)
  • 我很惊讶这在 `person.destroy; 时有效。person.errors` 没有。好发现! (2认同)

YWC*_*llo 5

此错误通常是由于dependent: :restrict_with_error模型中关联的指定而引发的。在模型定义(以及关联的模型定义)中快速搜索这一点,看看是否是这种情况。


Ber*_*i92 4

现在有完全相同的错误。我没有得到任何回溯,因为这是一个逻辑错误。

dependent: destroy就我而言,我的模型在模型中的关系中存在冲突。这意味着我的模型想要删除事先已删除的父模型。

我认为这有点令人困惑,我将通过声明模型来澄清:

class Section < ApplicationRecord
  has_many :contents, dependent: :destroy

class Content < ApplicationRecord
  belongs_to :section
  has_many :quizzes, dependent: :destroy

class Quiz < ApplicationRecord
  belongs_to :content, dependent: :destroy
Run Code Online (Sandbox Code Playgroud)

我删除了该部分section.destroy并收到错误。错误出现dependent: destroy在关系:Quiz模型中的内容中,因为该内容已被dependent: destroy部分模型中的删除。我希望这将有助于找到问题:)