2010-10-25 11 views
7

Duplicar posibles:
How can I avoid running ActiveRecord callbacks?Guardar active_record sin llamar devoluciones de llamada en rails3

En los carriles 2 había un método privado en active_records llamada create_without_callbacks que se podría llamar para guardar un registro en la base de datos sin activar las devoluciones de llamada asociadas con ese objeto. Este método ha desaparecido en los carriles 3, ¿hay alguna forma de lograr lo mismo?

+1

Esta pregunta establece explícitamente rieles 3. La supuesta duplicado se vuelven a escribir en los carriles 2 días, ahora contiene 4 carriles información, pero no aborda específicamente la creación de registros en los carriles 3 (aunque contiene información sobre la actualización de registros existentes en Rails 3). Esta pregunta es separada y distinta y no duplicada en mi opinión. – IAmNaN

Respuesta

2

Está impidiendo que ocurra cierta lógica comercial cuando llame al create_without_callbacks. Considere eliminar las devoluciones de llamadas si no son necesarias, o use las opciones :if y :unless para activar la devolución de llamada solo cuando sea necesario.

+0

Cuando estoy probando unidades de un objeto que depende de otro, a menudo quiero burlarme de la dependencia. Desafortunadamente, si hago eso active_record se queja de que el simulacro no es del tipo correcto. En los rieles 2 supere esto usando a la chica de la fábrica para crear lo que eran efectivamente talones del tipo correcto.Agregué una estrategia de chica de fábrica que insertaba un registro usando el método create_without_callbacks ya que eran irrelevantes. – opsb

+1

Lo entiendo, pero de esa forma no estarías probando objetos reales de la vida real. Entonces, esencialmente no estás probando el código de tu aplicación. Siempre utilizo Blueprint o FactoryGirl para crear objetos válidos, incluidas las devoluciones de llamada. – Ariejan

+0

Uso pepino para hacer pruebas de integración. Cuando estoy probando la unidad, el único objeto "real" que me importa es el que estoy probando. – opsb

-1

No sé si todo esto todavía funciona en R3, al menos en 2.3.8 lo hicieron.

si es sólo un atributo a continuación

self.update_attribute(:attribute, value) 

Si se trata de varios atributos en un objeto

self.update_attributes({:attribute => value}) 

También puede actualizar todos los registros con algunas condiciones

update_all("category = 'authorized' approved = 1, author = 'David'") 

El el último que saqué de la API Rails, creo que no invoca las retrollamadas, pero no estoy seguro de eso.

+0

No puede llamar a 'update_attributes' en un objeto no guardado. El objetivo es crear un nuevo objeto sin llamar a las devoluciones de llamada. – Ariejan

+1

sí, no vi la creación en las preguntas. – s84

+0

La respuesta de Sam me ayudó –

0

Después de haber examinado la fuente de rails3, parece que las devoluciones de llamada se añaden de tal forma que el método model.save en realidad no las conoce.

La solución a la que he recurrido es burlar Model.find y devolver una instancia que no se haya guardado. De hecho, así es como deben hacerse las pruebas unitarias y se ejecutan más rápido para arrancar.

Si usted está interesado en encontrar un hack le sugiero que busque en

  • rails3/ActiveSupport/lib/active_support/callbacks.rb
  • rails3/ActiveModel/lib/active_model/callbacks.rb
  • rails/activerecord/lib/active_record/callbacks.rb

en ese orden. joya

Cuestiones relacionadas