2009-12-13 11 views
5

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

  1. este comentario no está conectado a un poste (que es válido)
  2. 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.)

Respuesta

5

Creo que es extraño que Rails no te permita hacer esto. También afecta las validaciones en el modelo hijo.

Hay un billete con mucha discusión y ninguna resolución en el seguimiento de errores rieles en esto:

Nested attributes validations circular dependency

Y una propuesta de resolución:

nested models: build should directly assign the parent

Básicamente, la oferta es que el código de atributos anidados no establece la asociación principal en el registro secundario.

Hay algunas soluciones alternativas mencionadas en el segundo ticket al que me he vinculado.

+0

¿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

+0

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

+0

@Sai siguiendo los enlaces publicados, puedo ver que esto se puede lograr usando la opción 'inverse_of'. – artificis

0

No creo que pueda hacer esto. Por otro lado, sus validaciones no deberían estar fallando, ya que el orden de la transacción creará el registro posterior antes de guardar el comentario.

Cuestiones relacionadas