tal vez algunos expertos en ruby puedan arrojar algo de luz sobre cómo activerecord sabe hacer una inserción o actualización al llamar a save(). ¿Cuál es la lógica detrás de esto? ¿Comprueba si la clave principal está en blanco o algo así y, de ser así, una inserción, si no es una actualización?¿cómo sabe activerecord realizar una inserción o actualización?
Respuesta
Mientras que está bien para algunas personas que dicen "RTFM" Yo más bien la más recorrido, pero-aún-entirely- inútiles-when-Rails-3-viene-hacia fuera-y-cambios-todo la respuesta:
Cómo funciona en Rails 2.3 (también conocido como "hoy")
save
llama create_or_update
que se parece a esto:
def create_or_update
raise ReadOnlyRecord if readonly?
result = new_record? ? create : update
result != false
end
Puede pasar por alto la primera línea de este método, ya que sólo genera un error si el registro es de sólo lectura (no es por lo general, pero en el caso de combinaciones que pueda ser) . Lo que nos interesa aquí es la segunda y tercera líneas dentro del método.
La segunda línea llama new_record?
que se define como esto:
# Returns true if this object hasn't been saved yet -- that is, a record for the object doesn't exist yet; otherwise, returns false.
def new_record?
@new_record || false
end
Y la variable @new_record
se establece cuando el initialize
(new
llamadas initialize
, y nos da un nuevo objeto, algunos antecedentes Rubí-fu aquí) método se llama.
Así que si esto es @new_record
true
que van a llamar create
y si es falso que llamaré a update
que nos lleva a lo que está buscando, creo.
Además, cuando encuentra un registro, no llama al initialize
y, por lo tanto, no establece @new_record
. Si se dio cuenta, el código detrás de new_record?
fue @new_record || false
, lo que significa que devolverá falso si no se configuró @new_record
.
Digamos, por ejemplo, que desea encontrar el último registro Forum
, por lo que haría Forum.last
.
- Esto llama al método
last
en la claseForum
, que hereda de ActiveRecord :: Base last
calls el método de clasefind
.find
callsfind_last
find_last
callsfind_initial
find_initial
callsfind_every
find_every
callsfind_by_sql
find_by_sql
y llamadasinstantiate
Verá aquí que en ninguna parte a lo largo de este cambio se establece @new_record
y, por lo tanto, cualquier registro obtenido por find
no será un nuevo registro.
Espero que esto te ayude a entender.
muy buena respuesta y creo que por el tiempo que tomó para que lo escriba. También me interesa saber qué establecería @nw_record en falso. ¿Realizaría un hallazgo hacer eso si extrae un registro de la base de datos? – rip747
He actualizado la publicación con la cadena de métodos Find. –
¿Hay alguna forma de modificar el atributo "new_record" usted mismo? –
Principally se basa en el método new_record?.
Este método devuelve verdadero si es un registro nuevo y falso si no lo es.
De hecho, no es realmente difícil.
- Cuando obtiene un registro existente, no es nuevo. Entonces
new_record?
puede devolver falso de forma directa. - Cuando crea un nuevo registro (
Model.new
),new_record?
devolverá verdadero. Es un nuevo disco. - Cuando guarda ese nuevo registro, ya no es nuevo. La variable interna
@new_record
se actualiza.new_record?
ya no volverá a ser verdadero.
Para ver cuando sucede, vaya a ActiveRecord::Base, línea 2911
self.id ||= new_id
@new_record = false
id
end
Vas a vincular al maestro cuando probablemente esté usando 2.3. –
Eso no cambia mi argumento. Pero he actualizado el enlace de todos modos. –
- 1. Cómo realizar una inserción/actualización con datos centrales
- 2. JDBC inserción o actualización práctica
- 3. ¿Cómo realizo eficientemente una inserción o actualización masiva con SQLAlchemy?
- 4. Inserción o actualización masiva de NHibernate
- 5. Use un disparador para detener una inserción o una actualización
- 6. Inserción masiva O actualización con hibernación?
- 7. Inserción/actualización masiva de servidor Sql frente a MERGE en el escenario de inserción o actualización
- 8. ¿Realizar inserción para cada fila tomada desde una selección?
- 9. ¿La mejor práctica para realizar una actualización de Magento?
- 10. SQLBulkCopy o inserción masiva
- 11. Cómo realizar COUNT() o COUNT (*)
- 12. ActiveRecord O consulta
- 13. Creando o actualizando una asociación has_one ActiveRecord
- 14. SQL - Inserción y actualización de múltiples registros a la vez
- 15. inserción o actualización de registro DB Drupal con sólo una función
- 16. ¿Cuándo sabe cuándo usar TreeSet o LinkedList?
- 17. Cómo está Hibernate decidiendo el orden de actualización/inserción/eliminación
- 18. ¿Cómo mejorar el rendimiento de inserción/actualización de datos?
- 19. Problema con los enlaces de inserción/actualización con tinyMCE
- 20. ¿Cómo puedo hacer una declaración 'O' en ActiveRecord?
- 21. T-SQL ¿Es posible hacer una actualización/inserción con una sola operación rápida
- 22. CodeIgniter activerecord, recuperar el último id de inserción?
- 23. Javascript: ¿una actualización o una recarga?
- 24. ¿Cómo sabe Java cómo iterar una matriz?
- 25. Múltiples o condiciones en ActiveRecord
- 26. La forma más rápida de realizar la actualización masiva
- 27. inserción condicional de mysql en la actualización duplicada - registros múltiples
- 28. tabla de actualización de la inserción de datos VARBINARY
- 29. NHibernate todavía publica la actualización después de la inserción
- 30. ¿Es necesario encapsular una única instrucción de combinación (con inserción, eliminación y actualización) en una transacción?
Excelente pregunta. –