2008-09-23 12 views
6

¿Es el caso de que todo el verbo tranquilo se encuentre en una sola transacción que lo abarque todo? Es decir, si presento un error en la validación o devolución de llamadas en cualquier punto del manejo de una operación ACTUALIZAR, ELIMINAR o CREAR, ¿todas las operaciones de la base de datos que pude haber realizado en las devoluciones de llamada anteriores también se retrotraeron? De manera sucinta, ¿generar un error en una devolución de llamada o validación hace que no ocurra ningún cambio en la base de datos para esa acción verbal?¿Cuándo se inician las transacciones cuando se utilizan los raíles (de descanso)

Respuesta

3

¿Es el caso que todo el verbo tranquilo está en una única transacción que abarca todo?

Sin

si levanto un error en la validación o devoluciones de llamada en cualquier momento de la tramitación de un UPDATE, eliminar o crear la operación, es decir todas las operaciones de base de datos que pueda haber realizado en los anteriores las devoluciones de llamada también retrocedieron?

hace elevar un error en cualquiera de devolución de llamada o validación que sea tal que ningún cambio se produce en la base de datos para que la acción verbo?

Si desea este comportamiento puede crear explícitamente las transacciones en su controlador (ver los ejemplos proporcionados por otros usuarios), o utilizar un around_filter para fijar el comportamiento de todas sus acciones de descanso.

1

Algunos métodos (crear, destruir) van a la base de datos inmediatamente. Las transacciones se realizan utilizando el método de transacción en clases derivadas de ActiveRecord de la siguiente manera: (. Este ejemplo es para múltiples bases de datos para una base de datos única, que sólo necesita una transacción.)

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

Luego, puede deshacer en estas transacciones, y las excepciones arrojadas dentro de la transacción se propagan después de la reversión.

Esto depende de la base de datos que tenga transacciones.

NB: guardar y destruir están envueltos en transacciones.

+0

No necesita anidar las transacciones de esa manera. Cualquier llamada a .transaction acaba de pasar a ActiveRecord :: Base. Simplemente está llamando a ActiveRecord :: Base.transaction dos veces –

+0

Este es un ejemplo de la documentación de rieles. –

+0

¡Ah! Veo que se requiere para múltiples bases de datos. Actualizado. –

4

Por defecto no hay código de base de datos escrito dentro de una transacción, necesita decirle que haga eso en el código.

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 

Usando el #create! los métodos intentarán guardar el registro y, si fallan, generarán una excepción que luego revertirá cualquier código que ya se haya realizado dentro del bloque de transacción.

Si no rescatas la acción, serás redirigido a (creo) un 405.html en tu directorio público, si existe.

Cuestiones relacionadas