ja hallo erstmal,..

leider gelingt es mir noch nicht so ganz, das verhalten von AR in während 
unit-tests nachzuvollziehen.
Derzeit habe ich das Problem, dass destroy auf ein Objekt angewandt, dieses 
einfriert aber nicht aus der Datenbank löscht.

Also:
Ich habe einen kleinen Test:
http://pastie.caboo.se/133335

Der Hintergrund ist schnell erklärt:
Zwei Modelle (contacts und contact_combies) stehen in in einer habtm-Relation. 
Über einen setter im contact sollen attribute für das contact_combi gesetzt 
werden können (vgl. complex forms railscasts)

Das  contact-Modell sieht dann so aus:
http://pastie.caboo.se/133336

Das ContactCombi-Modell so:
http://pastie.caboo.se/133337

Dabei habe ich beobachtet:
- In der Anwendung funktioniert der Code einwandfrei
- Der Test bricht mit der assertion in Zeile 20 ab, da zwei statt (wie 
erwartet ein) Objekt existieren
- Es wird auf jeden Fall versucht das Objekt zu löschen, da das before_destroy 
Callback der ContactCombi aufgerufen wird, d.h. die Meldung (vgl. Zeile 8 - 
ContactCombi Modell) erscheint.
- Es wird keine delete-Anweisung auf der Datenbank Ausgeführt (vgl. Log)
- Richtig absurd wird's jedoch wenn die Safe-Anweisung wiederholt wird, d.h. 
Zeile 19 (unit-Test) ausgeführt wird. In diesem Fall erscheint die 
Fehlermeldung:

test_save_delete_multiple_contact_combies(ContactTest):
TypeError: can't modify frozen hash
    
/var/lib/gems/1.8/gems/activerecord-1.15.6/lib/active_record/base.rb:1978:in 
`[]='
    
/var/lib/gems/1.8/gems/activerecord-1.15.6/lib/active_record/base.rb:1978:in 
`write_attribute'
    
/var/lib/gems/1.8/gems/activerecord-1.15.6/lib/active_record/attribute_methods.rb:67:in
 
`attribute='
    
/var/lib/gems/1.8/gems/activerecord-1.15.6/lib/active_record/base.rb:1858:in 
`__send__'
    
/var/lib/gems/1.8/gems/activerecord-1.15.6/lib/active_record/base.rb:1858:in 
`method_missing'
    
/home/jan/aptana-workspace-svn/contacts/app/helpers/save_mixin_helper.rb:3:in 
`before_create'
...

D.h. destroy wird korrekt auf dem ContactCombi Objekt aufgerufen und der Hash 
wird - wie dokumentiert - eingefrohren.
Warum erscheinen aber die Änderungen nicht in der Datenbank? Kann dies am 
ActiveRecord-Cache liegen? - Wie erreiche ich, dass die delete Anweisung auf 
der Datenbank ausgeführt wird?

Danke,
Guten rutsch,
Jan
_______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug

Antwort per Email an