Supongamos que tenemos los modelos de comentario & estándar de publicación, con publicación que tiene accepts_nested_attributes_for :commments
y :autosave => true
conjunto.Rieles: ¿Cómo puedo acceder al modelo principal de las asociaciones anidadas de un nuevo registro?
podemos crear una nueva entrada, junto con algunas nuevas observaciones, por ejemplo:
@post = Post.new :subject => 'foo'
@post.comments.build :text => 'bar'
@post.comments.first # returns the new comment 'bar'
@post.comments.first.post # returns nil :(
@post.save # saves both post and comments simultaneously, in a transaction etc
@post.comments.first # returns the comment 'bar'
@post.comments.first.post # returns the post 'foo'
Sin embargo, tengo que ser capaz de distinguir desde el interior de comentario (por ejemplo, de su before_save o funciones de validación) entre
- este comentario no está conectado a un poste (que es válido)
- este comentario se une a un no salvo post (que es válido)
Desafortunadamente, simplemente llamando a self.post
de Comentario no funciona, porque por encima, devuelve nil hasta que se produzca el guardado. En una devolución de llamada, por supuesto, no tengo (y no debería) tener acceso a @post, solo para mí mismo del comentario en cuestión.
Entonces, ¿cómo puedo acceder al modelo principal de las asociaciones anidadas de un nuevo registro, desde la perspectiva de ese modelo de asociación anidado?
(FWIW, la muestra real con la que estoy usando esto permite a las personas crear un "comentario" desnudo y luego creará automáticamente una "publicación" para contenerlo si no hay uno ya. He simplificado esto ejemplo, por lo que no es específico de mi código de manera irrelevante.)
¿Cómo lo haría? ¿No desea establecer la columna parent_id, por lo que tendría que agregar algunas propiedades ocultas en el niño? – MattMcKnight
Puede establecer un atributo (por ejemplo, primario, secundarios) sin configurar los requisitos _ids. Así es como ahorra actualmente el modelo anidado, simplemente tiene esta falla de no ser recurrente. – Sai
@Sai siguiendo los enlaces publicados, puedo ver que esto se puede lograr usando la opción 'inverse_of'. – artificis