2010-12-13 13 views
7

Chcę utworzyć model do przechowywania komentarzy związanych z artykułami. Mam silne przeczucie, że w przyszłości będę potrzebował komentarzy do innych obiektów w aplikacji. Jak zaprojektować komentowanie w mojej aplikacji, aby było zgodne z dodawaniem nowych obiektów nadrzędnych. Chcę uniknąć scenariusza, w którym ma wiele kontrolerów/modeli dla każdego obiektu do relacji komentarzy.Zasób zagnieżdżony z wieloma zasobami nadrzędnymi w Railsach 3

Po obejrzeniu ekranu Ryana Batesa na Nested Resource, mam mocne pojęcie o tym, jak tp zagnieździć zasób pod jednym rodzicem. Jak mogę to osiągnąć w ramach 2 lub więcej zasobów rodzicielskich?

Dzięki!

+0

+100 jeśli naprawdę masz "mocne wyczucie" na zagnieżdżonych zasobach :) – Zabba

Odpowiedz

5

Dla „naprzód kompatybilny z dodawanie nowych obiektów nadrzędnych” części pytania:

Można użyć . Oto nice example. Zobacz także RailsCast #154.

Przykładem jak to może wyglądać dla Ciebie:

W comments kolumny tabeli może być tak:

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

Niektóre Przykładowe wyniki:

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

odpowiedzieć na część o trasach i znajdowanie zasobu.

Zwykły kontroler szyn odnalazłby zasób potomny od nadrzędnego.

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

GET /articles/0/comments/1 

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

Nie można tego zrobić u rodziców polimorficznych. Musiałbyś znaleźć rodzica od dziecka.

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) 

Możliwe, że trasy przekażą typ do kontrolera.

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) 

(ja nie próbowałem tej metody, to jest oczywiście pseudokod.)

Edit ...

Przypuszczam, można też po prostu dodać jeden parametry dla każdego rodzaju rodzica.

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) 
Powiązane problemy