Я пытаюсь улучшить работу с Rails и вложенными ресурсами. У пользователя есть много событий (и наоборот) через таблицу соединений UserEvent. Я также хочу, чтобы пользователь прокомментировал событие. До сих пор Event вложен в User в моих ресурсах. Как бы вы вложили Комментарий? Будет ли это вложено в Event, чтобы в User было два последовательно вложенных ресурса? Как это сработает?
Вложение ресурсов для комментария пользователя к событию
Ответы (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
, комментарии, скорее всего, перестанут быть полезными, поэтому вы можете просто их уничтожить.
:users
маршруты, включив в них: get 'comments', on: :member
чтобы получить URL-адрес для получения всех комментариев, которыми владеет пользователь.
- person Marc Baumbach; 17.01.2014