Вложенный ресурс с несколькими родительскими ресурсами в Rails 3 - PullRequest
7 голосов
/ 14 декабря 2010

Я хочу создать модель для хранения комментариев, связанных со статьями.У меня есть сильное чувство, что в будущем мне также понадобятся комментарии к другим объектам в приложении.Как создать комментарий в моем приложении, чтобы он был совместим с добавлением новых родительских объектов?Я хочу избежать сценария, в котором есть несколько контроллеров / моделей для каждого объекта, чтобы комментировать отношения.

После просмотра скриншота Райана Бейтса на Вложенный ресурс Я твердо понимаю, как вложитьресурс под одним родителем.Как мне добиться этого при 2 или более родительских ресурсах?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 14 декабря 2010

Для «прямой совместимости с добавлением новых родительских объектов» часть вопроса:

Вы можете использовать Полиморфные ассоциации .Вот хороший пример .Также см. RailsCast # 154 .

Пример того, как это может выглядеть для вас:

comments столбцы таблицы 'могут выглядеть следующим образом:

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

Некоторые примеры записей:

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 голосов
/ 22 сентября 2011

Ответить на часть о маршрутах и ​​поиске ресурса.

Обычный контроллер rails найдет дочерний ресурс от родителя.

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

GET /articles/0/comments/1

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

Вы не можете сделать это с полиморфными родителями. Вам нужно будет найти родителя от ребенка.

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)

Возможно, ваши маршруты могут передать тип контроллеру.

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)

(Я не пробовал этот подход, это явно псевдокод.)

Редактировать ...

Полагаю, вы также можете просто добавить один параметр для каждого типа родителя.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...