Domanda

È il caso che l'intero verbo riposante si trovi in ??una singola transazione onnicomprensiva? Vale a dire, se sollevo un errore nella convalida o nei callback in qualsiasi momento della gestione di un'operazione UPDATE, DELETE o CREATE, viene eseguito il rollback anche di tutte le operazioni del database che avrei potuto eseguire nei callback precedenti? In breve, l'innalzamento di un errore su qualsiasi callback o convalida lo rende tale che non si verifica alcuna modifica nel database per quell'azione verbale?

È stato utile?

Soluzione

  

È il caso che l'intero verbo riposante si trovi in ??una singola transazione onnicomprensiva?

No

  

se si verifica un errore nella convalida o nei callback in qualsiasi momento della gestione di un'operazione UPDATE, DELETE o CREATE, viene eseguito il rollback anche di tutte le operazioni di database che avrei potuto eseguire in precedenti callback?

No.

  

l'innalzamento di un errore su qualsiasi callback o validazione lo rende tale che non si verifica alcuna modifica nel database per quell'azione verbale?

No.

Se desideri questo comportamento, puoi creare esplicitamente transazioni nel tuo controller (vedi gli esempi forniti da altri utenti) oppure utilizzare un around_filter per associare il comportamento a tutte le tue azioni riposanti.

Altri suggerimenti

Per impostazione predefinita non esiste un codice di database scritto all'interno di una transazione, devi dirlo per farlo nel codice.

def create
  Model.transaction do
    Model.create!(params[:model])
    Model.association.create!(params[:association])
  end
  rescue ActiveRecord::RecordNotSaved, ActiveRecord::RecordInvalid
    flash[:notice] = "That record could not be saved."
    render :action => "new"
end

Uso di #create! i metodi tenteranno di salvare il record e, in caso di esito negativo, genereranno un'eccezione che eseguirà il rollback di qualsiasi codice già eseguito all'interno del blocco di transazione.

Se non ripristini l'azione, verrai reindirizzato a (credo) un 405.html nella tua directory pubblica, se presente.

Alcuni metodi (creare, distruggere) vanno immediatamente al database. Le transazioni si verificano utilizzando il metodo di transazione su classi derivate da ActiveRecord come segue:

Student.transaction do
  Course.transaction do
    course.enroll(student)
    student.units += course.units
  end
end

(Questo esempio è per più database. Per un singolo database, è necessaria solo una transazione.)

È quindi possibile eseguire il rollback di queste transazioni e le eccezioni generate all'interno della transazione vengono propagate dopo il rollback.

Questo dipende dal fatto che il database abbia transazioni.

NB: il salvataggio e la distruzione sono racchiusi in transazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top