2010-12-13 19 views
7

Makalelerle ilgili yorumları depolamak için bir model oluşturmak istiyorum. Gelecekte uygulamadaki diğer nesneler hakkında yorum isteyeceğim güçlü bir his var. Uygulamamda yorum yapmayı nasıl tasarlarım, böylece yeni üst nesneler ekleyerek uyumlu olacak şekilde nasıl geliştirebilirim? Her bir nesnenin ilişkiyi yorumlayabilmesi için birden fazla denetleyicinin/modelin bulunduğu bir senaryodan kaçınmak istiyorum.Birden çok üst kaynağa sahip iç kaynak Rails 3

Ryan Bates'in ekranını Nested Resource'da yayınladıktan sonra tp'nin bir kaynağın tek bir ebeveynin altında nasıl yuvalandığı konusunda sıkı bir kavrayış yapıyorum. Bunu 2 veya daha fazla ana kaynak altında nasıl başarabilirim?

Teşekkürler!

Sen kullanabilirsiniz: Sorunun bir parçası "yeni ebeveyn nesneler ekleyerek ileriye uyumlu" için

+0

+100 gerçekten iç içe kaynaklarda "sıkı bir kavramaya" sahipseniz :) – Zabba

cevap

5

. İşte bir nice example. Ayrıca bkz. RailsCast #154.

sizin için nasıl olabileceğiyle bir örnek:

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

Bazı Örnek kayıtlar:

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

cevaplamak için

comments tablo sütunları bu gibi olabilir rotaları ve kaynağı bulmakla ilgili bölüm.

Normal ray denetleyicisi, alt kaynağın üst öğeden bulunmasını sağlar.

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

GET /articles/0/comments/1 

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

Bunu polimorfik ebeveynlerle yapamazsınız. Ebeveynini çocuktan bulmalısın.

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) 

Rotalarınızın denetleyiciye bir tür geçiş yapması mümkündür.

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) 

(Ben bu yaklaşımı denedim değil, bu besbelli yalancı kod budur.)

Düzenleme ...

Ben ayrıca sadece ebeveynin her türü için bir parametre eklemek herhalde.

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)