Datamapper:报告我无法销毁记录的原因

时间:2013-01-09 10:45:49

标签: ruby datamapper ruby-datamapper

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

是否有可能获取datamapper给我更多反馈,哪种关系正是导致问题?

3 个答案:

答案 0 :(得分:9)

使用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

答案 1 :(得分: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。

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

答案 2 :(得分:0)

您可以从

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

有时候这并没有告诉你任何事情,在这种情况下你可以将你的代码放在开始/救援区域内,例如。

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