Вложение ресурсов для комментария пользователя к событию

Я пытаюсь улучшить работу с Rails и вложенными ресурсами. У пользователя есть много событий (и наоборот) через таблицу соединений UserEvent. Я также хочу, чтобы пользователь прокомментировал событие. До сих пор Event вложен в User в моих ресурсах. Как бы вы вложили Комментарий? Будет ли это вложено в Event, чтобы в User было два последовательно вложенных ресурса? Как это сработает?


person John    schedule 17.01.2014    source источник


Ответы (1)


Я думаю, что это был бы мой предложенный вложенный подход:

resources :users
resources :events do
  resources :comments
end

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

В вашем сценарии пользователь не принадлежит одному событию, а событие не принадлежит одному пользователю, поэтому представление ваших маршрутов таким образом не совсем моделирует отношения. Ваши URL будут выглядеть как /events/1/users/2. Это означает, что Пользователь 2 существует только в Событии 1.

Я думаю, было бы разумно, если бы ваши User и Event были ресурсами верхнего уровня. Comments, с другой стороны, имеют некоторое право собственности, которое имеет смысл вкладывать друг в друга. Более чем вероятно, что Comment будет ассоциироваться с Event в отношении контекста. User - это просто лицо, ответственное за это. Вложение комментариев под пользователем даст вам простые URL-адреса для отображения всех комментариев для пользователя, но я уверен, что вы с большей вероятностью отобразите все комментарии для Event. Имея это в виду, я бы предложил вложить Comments под Events.

Это также имеет смысл, если вы должны были удалить пользователя и nullify user_id в модели Comment. У вас все еще может быть URL для комментария. Если вы удалите Event, комментарии, скорее всего, перестанут быть полезными, поэтому вы можете просто их уничтожить.

person Marc Baumbach    schedule 17.01.2014
comment
Небольшое дополнение: вы можете изменить :users маршруты, включив в них: get 'comments', on: :member чтобы получить URL-адрес для получения всех комментариев, которыми владеет пользователь. - person Marc Baumbach; 17.01.2014