Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 17 su 17
  1. #11
    Nel mio controller adesso ho
    codice:
    Photo.destroy_by_ids([:photo_ids])
    e chiamo il metodo destroy_by_ids del modello Photo
    codice:
    class Photo < ActiveRecord::Base
    
      def self.destroy_by_ids(string)
          self.find(string).each(&:destroy)
      end  
    
      #da quello che ho capito devo aggiungere qualcosa di simile a 
      Photo.transaction do
         self.find(string).each(&:destroy)
      end
      # ma come faccia a chiamare quasta transazione e a passare i gli ids ad essa?
    
    end
    Questo per chiudere l'opetazione di destroy nella transazione.

  2. #12
    mlipreri quel codice copia incollato così non ha alcun senso.
    Prima di usare le transazioni, dovresti documentarti su cosa sono, come funzionano, se il tuo database le supporta e come gestirle.

    Non ti basta un link e 10 minuti per questo. Ancora meno, non serve a nulla un copia incolla nel tentativo di incastrare insieme pezzi di un puzzle.

  3. #13
    Utente di HTML.it L'avatar di toraz
    Registrato dal
    Nov 2001
    Messaggi
    263
    Originariamente inviato da weppos
    1. nella form mi ingegno in modo che i parametri passati siano nella forma

    photo_ids[]=2,3,4,5,6
    Me lo faresti un esempio? Non avrei proprio idea di come fare.

    codice:
    results = Photo.find(params[:photo_ids]).map(&:destroy)
    failed = results.any? { |result| result == false }
    Sono io che mi sono perso qualcosa o questo codice ritorna sempre false a meno che un find non sollevi un'eccezione perché non trova un id?

  4. #14
    Me lo faresti un esempio? Non avrei proprio idea di come fare.
    http://railscasts.com/episodes/52-up...ugh-checkboxes

    Sono io che mi sono perso qualcosa o questo codice ritorna sempre false a meno che un find non sollevi un'eccezione perché non trova un id?
    find non solleva eccezione in quel caso perché gli passi come parametro un array. Se non ricordo male, se un ID non esiste lui lo ignora. Al contrario di find(id).
    Destroy ritorna true o false a seconda che la cancellazione sia andata o meno a buon fine (per vari motivi).
    Usando map tu collezioni la sequenza di return e quindi avrai che se un elemento è false, allora quel record non è stato cancellato.

  5. #15
    Utente di HTML.it L'avatar di toraz
    Registrato dal
    Nov 2001
    Messaggi
    263
    Originariamente inviato da weppos
    http://railscasts.com/episodes/52-up...ugh-checkboxes
    Grazie.

    find non solleva eccezione in quel caso perché gli passi come parametro un array. Se non ricordo male, se un ID non esiste lui lo ignora. Al contrario di find(id).
    No, solleva un'eccezione in ogni caso (almeno su Rails 2.3.2).
    Un sistema che m'è venuto in mente su due piedi e che non è proprio eccezionale ma che potrebbe servire come spunto
    codice:
    def self.destroy_by_ids(s)
      ids = s.split(",")
      transaction { destroy(ids) }
    rescue ActiveRecord::RecordNotFound
      return nil
    end
    Destroy ritorna true o false a seconda che la cancellazione sia andata o meno a buon fine (per vari motivi).
    Usando map tu collezioni la sequenza di return e quindi avrai che se un elemento è false, allora quel record non è stato cancellato.
    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...

  6. #16
    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.

  7. #17
    Utente di HTML.it L'avatar di toraz
    Registrato dal
    Nov 2001
    Messaggi
    263
    La defecatio mattutina mi ha fatto venire in mente questo, che tiene conto anche dei record che non sono stati cancellati perché l'id non esiste
    codice:
    def self.destroy_by_ids(ids)
      ids.map { |id| destroy(id) rescue nil }.all?
    end

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.