Personalmente non condivido l'approccio fin dall'inizio. Non tanto quanto espresso da toraz che ha fornito il miglior supporto possibile, quanto l'idea iniziale di manipolare i dati della form in modo grezzo.
Io avrei fatto così:

1. nella form mi ingegno in modo che i parametri passati siano nella forma

codice:
photo_ids[]=2,3,4,5,6
In questo modo i parametri vengono automaticamente tradotti in un array, nel formato

params[hoto_ids] = [2, 3, 4, 5, 6, 7]

2. A questo punto, basta una chiamata a find con conseguente destroy.

Photo.find(params[hoto_ids]).each(&:destroy)

3. Se vuoi avere il risultato del destroy

results = Photo.find(params[hoto_ids]).map(&:destroy)
failed = results.any? { |result| result == false }

failed è false se c'è anche solo un record che non è stato cancellato.

4. Per sapere quale record, etc etc modifica la struttura a tuo piacimento. Questa è la versione semplice e parzialmente incompleta.

5. Io se avessi un comportamento simile procederei diversamente. Farei in modo di creare un metodo destroy! che mi lancia un'eccezione. Inserirei la lista di destroy in una transazione annullabile nel momento in cui anche uno solo dei destroy lancia eccezione.
In questo modo saprei quale ha lanciato eccezione, potrei prendere contromisure e soprattutto non avrei dati cancellati a metà.