No, solleva un'eccezione in ogni caso (almeno su Rails 2.3.2).
Hai ragione. Comunque è facilmente risolvibile.

codice:
# invece di
find(array)
# si può usare
all(:conditions => { :id => array })
Destoy ritorna l'oggetto freezato nal caso vada a buon fine e nel caso non vada a buon fine non saprei dire, non è documentato, leggendo il codice al volo non l'ho capito e non saprei come farlo fallire...
In effetti non avevo mai notato. In genere controllo semplicemente

codice:
if @instance.destroy
Questo significa che on failure ritorna nil o un valore che è convertibile in false.
Per farlo fallire ci sono alcune possibilità. Una che mi è capitata recentemente è un problema causato dalla presenza di un record invalido in una lista.
Usando acts_as_list, quando tenti di rimuovere un record, lui prima esegue un update impostando a nil il suo valore in lista. Purtroppo questo record era invalido quindi l'update falliva a causa di un errore di validazione, dunque falliva anche il destroy.

L'unico modo era andare di delete_all passando l'ID oppure aggiornarlo prima per renderlo valido.
Purtroppo non ho modo adesso di riprodurre il problema per sapere cosa ritorni. Credo cmq che ritorni nil o false a questo punto.