5

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

是否有可能让 datamapper 给我更多的反馈,到底是哪种关系导致了问题?

4

3 回答 3

10

使用数据映射器 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
于 2014-12-01T12:13:04.540 回答
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。

对于其他数据库,可以手动检查所有关联,先删除,再删除模型。</p>

于 2013-11-26T13:04:51.160 回答
0

您可以从以下位置获取有关 DataMapper 错误的信息

model.destroy
if model
  model.errors.each do |error|
    p error
  end
end

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

begin
  model.destroy
rescue Exception => exc
  p exc
end
于 2013-01-12T00:11:01.873 回答