2010-09-16 27 views
4

Je ne comprends pas pourquoi les crochets ne fonctionnent pas. Je le modèle suivant:Les crochets de Datamapper ne fonctionneront pas

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 

Quand j'appelle la méthode destroy soit de mon application ou RIR, il retourne false. Le hachage errors est vide, le message de journal ne s'imprime pas et l'enregistrement ne sera pas supprimé.

+0

Problème résolu par «détruire» écrasant, mais je suis intéressant pourquoi les crochets ne fonctionneront pas. –

Répondre

5

Ce crochet fonctionne pour moi (Ruby 1.9.2/DM 1.0.2):

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 

L'enregistreur de DM révèle que chacun des dir_photos sont détruits avant la dir_item est. Au lieu d'utiliser des crochets, vous pouvez cependant utiliser dm-constraints. Avec quelque chose comme:

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

vous pouvez être sûr que tous les dir_photos seront détruits lorsque le dir_item est détruit, et ce sera aussi appliquées par niveau de base de données clés étrangères.

+0

merci! Je ne savais pas sur: la contrainte :) – vitorbal