【发布时间】:2013-01-09 10:45:48
【问题描述】:
我正在使用 datamapper 和 dm-constraints 设置我的数据库模型。我有两个具有多对多关系的模型,但是当我尝试销毁一个模型时,我得到的唯一消息是false。
是否可以让 datamapper 向我提供更多反馈,具体是哪种关系导致了问题?
【问题讨论】:
-
sql 日志呢?
标签: ruby datamapper ruby-datamapper
我正在使用 datamapper 和 dm-constraints 设置我的数据库模型。我有两个具有多对多关系的模型,但是当我尝试销毁一个模型时,我得到的唯一消息是false。
是否可以让 datamapper 向我提供更多反馈,具体是哪种关系导致了问题?
【问题讨论】:
标签: ruby datamapper ruby-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
【讨论】:
很遗憾,DM 没有提供报告销毁失败原因的方法。
大多数时候销毁失败是因为它的关联。 DM 有一种机制来避免孤立记录。
为避免这种破坏失败,您可以使用 dm-constraints(https://github.com/datamapper/dm-constraints) 设置真正的数据库级外键引用,默认为保护,但可以设置为级联删除。
class List
has n, :todos, :constraint => :destroy (or :destroy!)
end
遗憾的是,目前 dm-constraints 仅支持 PostgreSQL 和 MySQL。
对于其他数据库,您可以手动检查所有关联并先将其删除,然后再删除模型。
【讨论】:
您可以从
获取有关 DataMapper 错误的信息model.destroy
if model
model.errors.each do |error|
p error
end
end
有时这并不能告诉您任何信息,在这种情况下,您可以将代码放在开始/救援块中,例如
begin
model.destroy
rescue Exception => exc
p exc
end
【讨论】: