2013-01-09 44 views
4

我使用datamapper和dm-contraints設置了我的db模型。我有兩個模型有多對多的關係,但當我試圖摧毀一個模型時,我得到的唯一信息是falseDatamapper:報告爲什麼我不能銷燬記錄

是否有可能讓datamapper給我更多的反饋一個關係正是導致問題的原因?

+0

什麼有關SQL日誌? – phoet

回答

0

您可以從

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

有時,不會告訴你任何東西,雖然,在這種情況下,你可以把一個開始/救援塊的代碼內如得到DataMapper的錯誤信息

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

這沒有幫助。這些錯誤不包含任何有用的信息,而model.destroy返回false,它不會引發異常。 – foxdonut

+0

@FredericDaoud對不起,這是我解決同樣的問題,當它發生在我身上(通過告訴我我有一個關聯的對象沒有被銷燬)。仔細檢查以確保所有關聯都正確配對,並確保它們正確銷燬。 – AlexQueue

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。

對於其他數據庫,您可以手動檢查所有的關聯和第一刪除,然後刪除型號

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

出色的工作。謝謝! +1 @Ger - 請接受這個答案! – mjtko

+0

偉大的工作確實非常有幫助!非常感謝@Samuel Rizzo! –

+0

這應該是DM中的一種內置方法,很好。 – mtjhax

相關問題