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).
小智 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)
现在有完全相同的错误。我没有得到任何回溯,因为这是一个逻辑错误。
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部分模型中的删除。我希望这将有助于找到问题:)