ruby-on-rails - 如何找出我无法 #destroy() 记录的原因?

标签 ruby-on-rails activerecord

person = Person.find(4123)
person.destroy #=> false

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

我没有回溯或错误可以查看。

最佳答案

更新 :请参阅 Mike Slate 的答案以获得更快的解决方案:https://stackoverflow.com/a/53872915/171183 .

我遇到了同样的问题,这是我为弄清楚发生了什么所做的一切......

(TL;DR:底部给出的完整代码 list 。)

首先,对于我试图销毁的对象的类,我运行它以找出所有关联设置为 dependent: :destroy :

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

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

ary.select! { |association_name| 
  <my_object>.send(association_name).present? 
}

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

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? }
# ...

然后我可以查看每个问题对象上的错误:

problem_objects.map(&:errors)

这就是我最终看到导致销毁失败的错误的地方。从那里开始,这是一个简单的编程问题(SMOP)来解决这个问题。

就我而言,有一个 before_destroy回调阻止销毁处理我的依赖对象关联之一。为了使将来更易于调试,我决定开始将错误记录到 Rails 日志中失败的回调(除了将错误消息添加到 errors.base 之外)。

完整代码 list :

my_object = <your_object_here>

ary = 
  my_object.class.reflect_on_all_associations.select { |a| 
    a.options[:dependent] == :destroy 
  }.map(&:name)

ary.select! { |association_name| my_object.send(association_name).present? }

associated_objects = 
  ary.flat_map { |association_name| my_object.send(association_name) }

problem_objects =
  associated_objects.select { |obj| obj.destroy; obj.errors.any? }

problem_objects.map(&:errors)

关于ruby-on-rails - 如何找出我无法 #destroy() 记录的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16767415/

相关文章:

ruby-on-rails - 合并两个 ruby 对象

ruby-on-rails - rails 4 : Getting QRCode to display in email via action mailer

ruby-on-rails - 将 JRuby 与 Rails 3.2 结合使用

mysql - codeigniter 使用 select 语句查询数据库

ruby-on-rails - Rails 如何仅从 ActiveRecord 对象中提取(和复制)某些属性?

mysql - 事件记录搜索查询

ruby-on-rails - 从应用程序布局调用 Controller 操作

ruby-on-rails - 具有动态分割的资源

ruby-on-rails - 根据 ActiveRecord 中的连接选择基于孙子属性的对象

php - Codeigniter 事件记录类错误与 MySQL 原始查询