2010-09-16 43 views
4

無法理解爲什麼掛鉤不起作用。我有以下型號:Datamapper的掛鉤不起作用

class DirItem 
    include DataMapper::Resource 

    # property <name>, <type> 
    property :id, Serial 
    property :dir_cat_id, Integer, :required => true 
    property :title, String, :required => true 
    property :price, Integer, :default => 0 

    belongs_to :dir_cat 
    has n, :dir_photos 
    has n, :dir_field_values 

    before :destroy do 
    logger.debug "==============DESTROYING ITEM ##{id}, TITLE 
#{title}" 
    dir_field_values.destroy 
    dir_photos.destroy 
    end 
end 

當我打電話destroy方法無論是從我的應用程序或IRB,它返回falseerrors散列爲空,日誌消息不打印,記錄不會被刪除。

+0

問題通過'destroy'覆蓋解決,但我很有趣爲什麼鉤子不起作用。 – 2010-09-16 08:32:44

回答

5

這個鉤子對我的作品(紅寶石1.9.2/1.0.2 DM):

require 'rubygems' 
require 'dm-core' 
require 'dm-migrations' 


# setup the logger 
DataMapper::Logger.new($stdout, :debug) 

# connect to the DB 
DataMapper.setup(:default, 'sqlite3::memory:') 

class DirItem 
    include DataMapper::Resource 

    # property <name>, <type> 
    property :id, Serial 
    property :dir_cat_id, Integer, :required => true 
    property :title, String, :required => true 
    property :price, Integer, :default => 0 

    has n, :dir_photos 

    before :destroy do 
    dir_photos.destroy 
    end 
end 

class DirPhoto 
    include DataMapper::Resource 
    property :id, Serial 
    belongs_to :dir_item 
end 

DataMapper.finalize.auto_migrate! 

@i = DirItem.create(:title => 'Title', :dir_cat_id => 1) 
@i.dir_photos.create 
@i.dir_photos.create 
@i.dir_photos.create 
@i.destroy 

的DM記錄顯示,每個dir_photos的前dir_item是被破壞。不過,你可能想用dm-constraints來看看。喜歡的東西:

has n, :dir_photos, :constraint => :destroy 

你可以肯定的是,當dir_item被銷燬所有dir_photos將被銷燬,而這也將通過數據庫級​​別的外鍵約束強制執行。

+0

謝謝!我不知道:約束:) – vitorbal 2012-05-05 02:24:31