2012-02-12 9 views
12

Tengo dificultades para comprender cómo implementar un solo modelo de autoinscripción en Rails. El Guide to ActiveRecord Associations section 2.10 explica brevemente Autocombinaciones pero no ofrece suficiente información, y cada ejemplo o publicación al respecto hace referencia al ejemplo de Friend Friend Railcast que no es un modelo de autocombinación, como se describe en el Rails Guide section 2.10.Understanding Rails ActiveRecord "single model" se une a sí mismo

La idea es un modelo que tiene_mucho y pertenece_a sí mismo, sin necesidad de una tabla separada para la relación. La única razón por la que veo para necesitar una tabla separada es si desea que la relación contenga más información que solo la relación. p.ej. "mejores amigos", "casi no los conocemos"

Tengo un esquema simple de la publicación:

create_table "posts", :force => true do |t| 
    t.datetime "posted" 
    t.string "nick" 
    t.string "title" 
    t.text  "content" 
    t.integer "parent_post_id" 
    t.datetime "created_at",  :null => false 
    t.datetime "updated_at",  :null => false 
end 

El parent_post_id es una auto-referencia a otros de post_id de correos. El modelo posts.rb tiene la relación definida:

class Post < ActiveRecord::Base 
    has_many :replies, :class_name => "Post" 
    belongs_to :parent_post, :class_name => "Post", 
    :foreign_key => "parent_post_id" 
end 

En el controlador o ver Estoy esperando a ser capaz de hacer algo como esto:

@posts.each do |post| 
    ... 
    @replies = post.replies 
    @replies.each do |reply| 
    ... 
    end 
end 

O encontrar a los padres del mensaje:

@parent_post = post.parent_post 

Esto puede ser un error de sintaxis. Así que gracias de antemano a cualquiera que pueda darme algo de sentido. Revisé todas las publicaciones de SO y de blog y ninguno de ellos prueba el método de auto-referencia autorregulado de un solo modelo descrito en la Guía.

Puntos para cualquier persona que ofrezca una explicación que no apunte al ejemplo de Amigo amistoso que usa una tabla de relaciones separada.

+0

Sería más fácil comenzar si describió lo que estaba sucediendo o no de la forma esperada. Además, cosas como 'act_as_tree' son de una sola tabla, un solo modelo autorreferencial: ¿has considerado mirar algo así? –

+0

Pensé que sí. Esperaba poder llamar a post.replies y obtener un conjunto de instancias de publicaciones que se completaron según la publicación principal, mediante parent_post_id = post_id. – garlicman

+0

Eso explica lo que hiciste. No es lo que pasó –

Respuesta

23

Me faltaba la clave externa has_many para "parent_post_id". Una vez establecido, las respuestas posteriores harán referencia a otras instancias de publicaciones por parent_post_id.

El modelo posts.rb tiene la relación definida:

class Post < ActiveRecord::Base 
    has_many :replies, :class_name => "Post", 
    :foreign_key => "parent_post_id" 
    belongs_to :parent_post, :class_name => "Post", 
    :foreign_key => "parent_post_id" 
end 

ahora puedo crear mensajes, asignar un parent_post_id a un diverso poste, luego obtener todos los mensajes que son respuestas a cualquier padre Post.