Antes de publicar esto como un error para el equipo de rieles, quería ver si estoy haciendo algo mal que puede estar causando este comportamiento. Específicamente, la propiedad: autoguardar de asociaciones has_many no parece funcionar según los documentos.: propiedad de autoguardado de has_many asociaciones rotas en Rails 2.3.4?
Para referencia, aquí es la documentación de la API más reciente: http://api.rubyonrails.org/classes/Acti ... ation.html
Tome un vistazo a la sección de "uno a muchos Ejemplo". He duplicado el código allí exactamente en una aplicación de prueba, y no funciona para mí. Específicamente, el objeto primario se actualiza, pero el objeto secundario no.
Mi esquema es el siguiente:
create_table :posts do |t|
t.string :title
t.timestamps
end
create_table :comments do |t|
t.text :body
t.integer :post_id
t.timestamps
Mis modelos son los siguientes:
class Post < ActiveRecord::Base
has_many :comments, :autosave => true
end
class Comment < ActiveRecord::Base
belongs_to :post
end
En la consola, corro los siguientes comandos (los objetos postales y comentarios ya están en el PP en este punto):
post = Post.find(1)
post.title # => "The current global position of migrating ducks"
post.comments.first.body # => "Wow, awesome info thanks!"
post.comments.last.body # => "Actually, your article should be named differently."
post.title = "On the migration of ducks"
post.comments.last.body = "Actually, your article should be named differently. [UPDATED]: You are right, thanks."
post.save
post.reload
Pero esto es lo que me pasa por la salida:
post.title # => "On the migration of ducks"
post.comments.last.body # => "Actually, your article should be named differently."
Además, busca en los registros de esto es la única instrucción de actualización que veo:
mensaje de actualización (0,6 ms) Update "mensajes" SET "updated_at" = '2010-01-18 23:32: 39 ', "título" =' En la migración de patos 'DONDE "id" = 1
Parece que el guardado no cayó en cascada al objeto de comentarios, lo cual me parece claramente roto. He probado esto en dos sistemas diferentes que ejecutan 2.3.4 y el comportamiento es repetible.
Aquí está la parte extraña: si primero llamo a "post.commentos" antes de intentar establecer el valor, ¡funciona bien! Para ser exactos:
post.title = "On the migration of ducks"
post.comments #Note that this line was not called above
post.comments.last.body = "Actually, your article should be named differently. [UPDATED]: You are right, thanks."
post.save
post.reload
Ahora la salida me da los resultados correctos:
post.title # => "On the migration of ducks"
post.comments.last.body # => "Actually, your article should be named differently. [UPDATED]: You are right, thanks."
Y los registros contienen la actualización correcta:
comentario actualización (0.3ms) Update "comentarios" SET "updated_at" = '2010-01-18 23:44:43', "body" = 'En realidad, su artículo debe tener un nombre diferente. [ACTUALIZADO]: Tienes razón, gracias. DONDE "id" = 2
Así que esto realmente se ve roto para mí. Supongo que es un problema con la forma en que se manejan las referencias a objetos, es decir, que una vez que el objeto es parte de una colección asignada, se guarda bien, pero no se guarda cuando se extrae como un único objeto de la base de datos. Pero antes de enviar esto al equipo de Rails como un error que quería ver si alguien más se había topado con este problema, o si estoy haciendo algo completamente desquiciado que no estoy viendo porque he pasado todo el día en esto .
no creo que usted puede fijar un error de Rails 2.3.4, ya que ni siquiera es el último lanzamiento estable de la serie 2.3. Es posible que haya un error corregido en el módulo AutosaveAssociation. Incluso dudaría que hagan una corrección de errores en 2.3.11. –