2010-12-13 20 views
7

Deseo crear un modelo para almacenar los comentarios relacionados con los artículos. Tengo una fuerte sensación de que en el futuro también querré comentarios sobre otros objetos en la aplicación. ¿Cómo diseño los comentarios en mi aplicación para que sea compatible con la adición de nuevos objetos principales? Quiero evitar un escenario en el que haya varios controladores/modelos para cada relación de comentario a objeto.Recurso anidado con recursos principales múltiples en Rails 3

Después de ver la pantalla de proyección de Ryan Bates en Nested Resource tengo una comprensión firme de cómo tp anidar un recurso bajo un único padre. ¿Cómo logro esto con menos de 2 o más recursos para padres?

Gracias!

+0

+100 si realmente tiene una "comprensión firme" de los recursos anidados :) – Zabba

Respuesta

5

Por "hacia adelante compatible con la adición de nuevos objetos padre" parte de la pregunta:

usted podría utilizar . Aquí hay un nice example. También vea RailsCast #154.

Un ejemplo de cómo podría ser similar para usted:

Los comments columnas de la tabla podría ser así:

id:integer 
commentable_type:string 
commentable_id:integer 
comment_text:string 

Algunos registros de la muestra:

1,'Article',12,'My first comment' #comment on an Article model 
2,'Question',12,'My first comment' #comment on a Question model 
3,'Question',15,'My first comment' #comment on a Question model 
0

para responder a la parte sobre las rutas y encontrar el recurso.

El controlador de rieles habitual encontraría el recurso hijo del padre.

GET /articles/{parent_id}/comments/{id} 

GET /articles/0/comments/1 

article = articles.find(parent_id = 0) 
comment = article.comments.find(id = 1) 

No se puede hacer eso con padres polimórficos. Tendría que encontrar el padre del niño.

GET /article/{parent_id}/comments/{id} 
GET /questions/{parent_id}/comments/{id} 

GET /article/0/comments/1 
GET /questions/0/comments/1 

parent = comments.select(parent_id = 0).parent 
comment = parent.comments.find(id = 1) 

Es posible que sus rutas pasen de un tipo al controlador.

GET /{parent_type}/{parent_id}/comments/{id} 

GET /article/0/comments/1 
GET /questions/0/comments/1 

parent = parent_type.find(parent_id = 0) 
comment = parent.comments.find(id = 1) 

(no he probado este enfoque, esto es, obviamente pseudocódigo.)

Editar ...

supongo que también podría simplemente agregar uno parámetros para cada tipo de padre.

GET /article/{article_id}/comments/{id} 
GET /questions/{question_id}/comments/{id} 

GET /article/0/comments/1 
GET /questions/0/comments/1 

if article_id 
    article = articles.find(article_id = 0) 
    comment = article.comments.find(id = 1) 

if question_id 
    question = questions.find(question_id = 0) 
    comment = question.comments.find(id = 1) 
Cuestiones relacionadas