【问题标题】:Datamapper: report why I can't destroy recordDatamapper:报告为什么我不能销毁记录
【发布时间】:2013-01-09 10:45:48
【问题描述】:

我正在使用 datamapper 和 dm-constraints 设置我的数据库模型。我有两个具有多对多关系的模型,但是当我尝试销毁一个模型时,我得到的唯一消息是false

是否可以让 datamapper 向我提供更多反馈,具体是哪种关系导致了问题?

【问题讨论】:

  • sql 日志呢?

标签: ruby datamapper ruby-datamapper


【解决方案1】:

使用数据映射器 1.2.1:

def why_you_no_destroy? model
  preventing = []
  model.send(:relationships).each do |relationship|
    next unless relationship.respond_to?(:enforce_destroy_constraint)
    preventing << relationship.name unless relationship.enforce_destroy_constraint(model)
  end
  preventing
end

【讨论】:

  • 出色的工作。谢谢! +1 @Ger -- 请接受这个答案!
  • 确实很棒而且很有帮助!非常感谢@Samuel Rizzo!
  • 这应该是DM内置的方法,不错。
【解决方案2】:

很遗憾,DM 没有提供报告销毁失败原因的方法。

大多数时候销毁失败是因为它的关联。 DM 有一种机制来避免孤立记录。

为避免这种破坏失败,您可以使用 dm-constraints(https://github.com/datamapper/dm-constraints) 设置真正的数据库级外键引用,默认为保护,但可以设置为级联删除。

class List
  has n, :todos, :constraint => :destroy (or :destroy!)
end

遗憾的是,目前 dm-constraints 仅支持 PostgreSQL 和 MySQL。

对于其他数据库,您可以手动检查所有关联并先将其删除,然后再删除模型。

【讨论】:

    【解决方案3】:

    您可以从

    获取有关 DataMapper 错误的信息
    model.destroy
    if model
      model.errors.each do |error|
        p error
      end
    end
    

    有时这并不能告诉您任何信息,在这种情况下,您可以将代码放在开始/救援块中,例如

    begin
      model.destroy
    rescue Exception => exc
      p exc
    end
    

    【讨论】:

    • 这没有帮助。这些错误不包含任何有用的信息,并且 model.destroy 返回 false,它不会引发异常。
    • @FredericDaoud 对不起,当它发生在我身上时,我就是这样解决了同样的问题(告诉我我有一个没有被销毁的关联对象)。仔细检查以确保您的所有关联都正确配对并正确销毁。
    猜你喜欢
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多