Ruby Datamapper:报告为什么我可以';不要破坏记录

Ruby Datamapper:报告为什么我可以';不要破坏记录,ruby,datamapper,ruby-datamapper,Ruby,Datamapper,Ruby Datamapper,我正在使用datamapper和dm约束设置我的db模型。我有两个模型,它们有多对多的关系,但当我试图破坏其中一个模型时,我得到的唯一信息是false 有没有可能让datamapper向我提供更多反馈—哪种关系正是问题的根源?您可以从 model.destroy if model model.errors.each do |error| p error end end 有时这并不能告诉你任何事情,在这种情况下,你可以把你的代码放在begin/rescue块中 begin m

我正在使用datamapper和dm约束设置我的db模型。我有两个模型,它们有多对多的关系,但当我试图破坏其中一个模型时,我得到的唯一信息是
false


有没有可能让datamapper向我提供更多反馈—哪种关系正是问题的根源?

您可以从

model.destroy
if model
  model.errors.each do |error|
    p error
  end
end
有时这并不能告诉你任何事情,在这种情况下,你可以把你的代码放在begin/rescue块中

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

不幸的是,DM没有提供报告销毁失败原因的方法

大多数情况下,销毁失败是因为其关联性。DM有一种避免孤立记录的机制

为了避免这种销毁失败,您可以使用dm constraints()设置真正的数据库级外键引用,默认情况下该外键引用是保护的,但可以改为设置为级联删除

class List
  has n, :todos, :constraint => :destroy (or :destroy!)
end
遗憾的是,目前dm约束只支持PostgreSQL和MySQL

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

使用datamapper 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
def你为什么不销毁?模型
阻止=[]
model.send(:关系)。每个do |关系|
下一步除非关系。响应(强制销毁约束)

阻止sql日志呢?这没有帮助。错误不包含任何有用的内容,model.destroy返回false,它不会引发异常。@FredericDaoud抱歉,这就是发生在我身上的同一问题的解决方法(告诉我,我有一个未被销毁的关联对象)。仔细检查,确保所有关联都正确配对,并正确销毁。干得好。谢谢+1@Ger——请接受这个答案!真是伟大的工作,非常有帮助!非常感谢@Samuel Rizzo!这应该是DM中的内置方法,很好。