0

У меня есть учебный сайт Q/A, который позволяет пользователям ссылаться на свои вопросы (вопросы) и ответы (ответы) с научными публикациями, которые являются третьей моделью, цитатами.Rails 4: Полиморфные ассоциации - это плохой подход, если одна модель вложена в другую?

Ответы - это вложенный ресурс в Вопросах. Сначала я думал, что полиморфная ассоциация с Citations будет хорошей, но я столкнулся с проблемами, в результате чего динамические пути в этом случае. Путь может быть, например,

/question/1/search_for_citation 

Или

/question/1/answer/2/search_for_citation 

Мой вопрос прост. В этом случае было бы лучше просто укусить пулю и иметь отдельную модель для каждого i.e. Citation принадлежит Вопросу и скажем, например, Reference принадлежит к Ответу и использует модуль для включения общей функциональности. Я хотел сделать что-то вроде Rails, но ...

ответ

0

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

0

Если у вас есть следующие модели:

class Question < ActiveRecord::Base 
    has_many :answers, dependent: :destroy 
    has_many :citations, as: :topic, dependent: :destroy 
end 

class Answer < ActiveRecord::Base 
    belongs_to :question 
    has_many :citations, as: :topic, dependent: :destroy 
end 

class Citation < ActiveRecord::Base 
    belongs_to :topic, polymorphic: true 
end 

Тогда вы могут вложенные ресурсы на основе маршрутизации, как это:

resources :questions do 
    resources :answers do 
    resources :citations 
    end 
    resources :citations 
end 

Однако, он сообщил, что ресурсы никогда не должны быть вложенным в глубину более 1 уровня (http://guides.rubyonrails.org/routing.html#limits-to-nesting), и здесь неглубокий гнездование входит в p (http://guides.rubyonrails.org/routing.html#shallow-nesting).

Если переопределить ваши маршруты, как это:

resources :questions, shallow: true do 
    resources :answers do 
    resources :citations, only: [:index, :new, :create] 
    end 
    resources :citations 
end 

бегущие рейк маршруты возвратит следующее:

 answer_citations GET /answers/:answer_id/citations(.:format)   citations#index 
         POST /answers/:answer_id/citations(.:format)   citations#create 
    new_answer_citation GET /answers/:answer_id/citations/new(.:format)  citations#new 
     edit_citation GET /citations/:id/edit(.:format)     citations#edit 
      citation GET /citations/:id(.:format)      citations#show 
         PATCH /citations/:id(.:format)      citations#update 
         PUT /citations/:id(.:format)      citations#update 
         DELETE /citations/:id(.:format)      citations#destroy 
    question_answers GET /questions/:question_id/answers(.:format)  answers#index 
         POST /questions/:question_id/answers(.:format)  answers#create 
    new_question_answer GET /questions/:question_id/answers/new(.:format) answers#new 
      edit_answer GET /answers/:id/edit(.:format)      answers#edit 
       answer GET /answers/:id(.:format)       answers#show 
         PATCH /answers/:id(.:format)       answers#update 
         PUT /answers/:id(.:format)       answers#update 
         DELETE /answers/:id(.:format)       answers#destroy 
    question_citations GET /questions/:question_id/citations(.:format)  citations#index 
         POST /questions/:question_id/citations(.:format)  citations#create 
new_question_citation GET /questions/:question_id/citations/new(.:format) citations#new 
      questions GET /questions(.:format)       questions#index 
         POST /questions(.:format)       questions#create 
     new_question GET /questions/new(.:format)      questions#new 
     edit_question GET /questions/:id/edit(.:format)     questions#edit 
      question GET /questions/:id(.:format)      questions#show 
         PATCH /questions/:id(.:format)      questions#update 
         PUT /questions/:id(.:format)      questions#update 
         DELETE /questions/:id(.:format)      questions#destroy 

Другими словами, URL-мудрый, перечисляя дочерние объекты, а также создание или редактирование новый дочерний объект всегда выполняется в контексте родительского объекта, но показ, обновление, удаление или редактирование существующего объекта выполняется непосредственно над объектом.

 Смежные вопросы

  • Нет связанных вопросов^_^