【问题标题】:Destroy nil value in Active Record collection销毁 Active Record 集合中的 nil 值
【发布时间】:2018-03-23 04:10:24
【问题描述】:

我有一个模型,它被称为Scriptshas_many => Pages 因此,Page belongs_to => Scipts

我删除了一个页面对象,现在在运行Script.pages 时,第一个值是nil(幸运的是它是第一个值,因为如果不是,我没有其他方法可以引用它,因为它没有 ID)

我需要 destroy nil 值,因为它通过成为 nil 破坏了我的应用程序但是,运行 Script.pages.first.destroy 返回:

NoMethodError: undefined method `destroy' for nil:NilClass

这是有道理的。现在,我需要知道如何从我的页面集合中获取这些损坏的数据。

有没有办法做到这一点?谢谢!

【问题讨论】:

  • 你不能破坏不存在的东西。如果您需要它不是nil,那么您需要创建一个页面,以便first 返回一个有用的对象。您需要销毁它。
  • 你是如何在页面调用中得到 nils 的?

标签: ruby-on-rails ruby activerecord


【解决方案1】:

给你Array.compact:

Script.pages.compact.first.destroy

您也可以尝试使用ActiveRecord::Relation.reload 重新加载您的收藏:

Script.pages.reload.first.destroy

【讨论】:

    【解决方案2】:

    您没有任何页面。 0 == script.pages.count 将返回 true.first 方法在一个空数组上返回一个 nilassert [].first.nil? 会过去的。

    【讨论】:

    • 所以我确实有Script.pages 确实有页面。但是,在该页面集合中,有一个 nil 对象。
    • p script.pages.map(&:nil?) 打印出什么?
    • 好问题!它返回我所期望的:=> [true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] 第一个对象是nil,其余的都不是
    • ActiveRecord 不应该这样做。您能否阅读log/test.log 中的SELECT 语句,并找到填充该.pages 成员的语句?如果您在数据库控制台中单独运行 SELECT 语句,它会返回什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多