【问题标题】:Cannot destroy records for some models in rails无法销毁rails中某些模型的记录
【发布时间】:2020-04-11 11:29:21
【问题描述】:

我有一个具有 2 个关联且没有验证的模型,可以创建它,但如果我想销毁它,我会收到错误“ActiveRecord::RecordNotDestroyed” 所以我直接在rails中尝试为这个模型创建新记录,然后运行destroy,但它回滚而没有任何错误消息。如果我真的毁了!我得到了错误。我启用了 mysql 查询日志记录,但它看起来甚至无法删除部分,所以我认为 rails 以某种方式防止破坏这个模型。

作为测试,我创建了没有任何关联的虚拟模型,只有一个字符串值。 Rails 控制台中的相同问题。我必须注意 .delete 方法有效,但 .destroy 无效

然后我开始在我的 rails 应用程序中进行分析(我从某人那里接管了它,所以我仍然不是 100% 熟悉)并在 rails 控制台中尝试销毁不同模型的一些记录,并意识到有些我可以销毁,有些不是。

有什么方法可以找出我无法销毁这些记录的原因吗?如果没有任何验证或关联,我的 Testmodel 真的很奇怪。有什么地方可以查找更多信息吗?我试过这个:

testrecord.destroy; testrecord.errors but in @messages I have empty {}

这是我发现问题的模型代码 (EinvoiceContact) 以及我的测试模型

class EinvoiceContact < ActiveRecord::Base
  belongs_to :customer
  has_many :building
end

class Customer < ActiveRecord::Base

  has_many :einvoice_contacts, dependent: :destroy
  accepts_nested_attributes_for :einvoice_contacts, allow_destroy: true, reject_if: :empty_einvoice_contact

end

class Testmodel < ActiveRecord::Base
end

这里是rails和mysql日志的输出

> irb(main):045:0> Testmodel.find(1).destroy\r   Testmodel Load (0.4ms) 
> SELECT  `testmodels`.* FROM `testmodels` WHERE `testmodels`.`id` = 1
> LIMIT 1    (0.1ms)  BEGIN    (0.1ms)  ROLLBACK
> => false
> 
> 
> 2019-12-18T21:05:42.455378Z      33 Query SELECT  `testmodels`.* FROM
> `testmodels` WHERE `testmodels`.`id` = 1 LIMIT 1
> 2019-12-18T21:05:42.456559Z      33 Query BEGIN
> 2019-12-18T21:05:42.458261Z      33 Query ROLLBACK

在哪里可以找到更多详细信息,或者可以在哪里进行设置,我们将不胜感激。这个应用程序使用 CanCan 但我已经设置了

can :manage, :all

Rails 是 4.2.8 和 ruby​​ 2.1.4(我知道它是旧应用程序,我只是接管并维护),mysql 谢谢

【问题讨论】:

标签: mysql ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

Testmodel.find(1) 是否返回任何内容?

试试Testmodel.find(1).destroy!(带感叹号)看看它是否能告诉你更多信息。

【讨论】:

  • 是的,Testmodel.find(1) 返回一条记录,Testmodel.find(1).destroy!得到我提到的 activerecord 错误
  • Testmodel 和其他 Model 有关系吗?
  • 完全没有关系,只是一个字符串值的简单模型
【解决方案2】:

似乎Testmodel有一些关联。
在控制台中试试这个并检查输出。

Testmodel.reflect_on_all_associations

【讨论】:

  • 没有关联...终于找到问题了,在代码深处,ActiveRecord::Base类默认添加了false来销毁
【解决方案3】:

问题解决了,在 lib 文件夹中添加了这段代码,除非我将模型 can_destroy 设置为 true,否则可以防止破坏任何东西

感谢大家的帮助

class ActiveRecord::Base
  def can_destroy?
    false
  end

  before_destroy do
    can_destroy?
  end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多