Вопрос

Итак, вот пример сценария. Есть студенческий ресурс resources :students, и студенты имеют и принадлежат многим коллекциям: resources :clubs, resources :majors, и т.д.

Таким образом, мы можем достаточно легко настроить наши маршруты ...

resources :clubs do
  resources :students
end
resources :majors do
  resources :students
end
resources :students do
  resources :clubs
  resources :majors
end

который генерирует нам кучу стандартных плотных маршрутов

  • /клубы
  • /клубы/: id
  • /clubs/: club_id/студенты
  • /clubs/: club_id/students/: id
  • /майоры
  • /Majors/: id
  • /Majors/: major_id/студенты
  • /Majors/: Major_id/Student/: ID
  • /ученики
  • /студенты/: id
  • /Студенты/: Студент_ID/Клубы
  • /Студенты/: Student_id/Clubs/: ID
  • /Студенты/: Студент_ID/Majors
  • /Студенты/: Студент_ID/Majors/: ID

Итак, вот мой вопрос. С семантикой отдыха, как можно удалить специальность для студента? Просмотр студентов под крупным /majors/:major_id/students/:id покажет, что студент в конкретной коллекции майора. Но маршрут удаления: ID, указывает на StudentsController#destroy, который полностью удалил бы студента. Упс! Так что, возможно, мы идем в другую сторону и выполняем удаление на ресурсе в /students/:student_id/majors/:id И теперь в этой школе больше не предлагается подводная панель.

Теперь, предоставленные, мы могли бы установить метод уничтожения ClubScontroller, MajorsController или StudentController для поиска Club_id, или Major_id, или Student_id, но, скажем, мы также в будущем хотим добавить братства и выпускные классы и т. Д. Каждый класс начнет быть Состоит из огромных условий переключателя, которые, чтобы увидеть, что присутствовало Param ..., а затем найдите коллекцию либо верхнего ресурса и удалите нижний ресурс, либо Vise Versa. Сами модели должен Решите, удаляются ли они, если у них больше нет записей об ассоциации ... «Уничтожить» на этом ресурсе, стало действительно неправильным ...

Есть ли более простой способ сделать это? Даже популярные плагины Restful Rails, такие как make_resourceful или resource_controller Взорвел бы подводную паутину при удалении его из майоров Джо или полностью удалил Джондо, когда он убрал его из крупного подводного борьбы. Казалось бы, есть потенциал для рассмотрения ассоциации, чтобы понять желаемые последствия семантики и того, что должно делать «уничтожение».

С другой стороны, я все смотрю на это неправильно? Разве это не подводное оборудование -> Джо, а под водой, новичком+Джо как единственный ресурс, и то, что мы удаляем, действительно не Джо, ни под водой, но ресурс, представляющий комбинацию? Тем не менее, это нелегко, когда контроллеры являются студентами и специальностями, которые фактически представляют ресурсы с таким же названием (MVC действительно стал RV ... в подходе «Конвенция» и не разрабатывая контроллеры, которые могут не иметь никакого отношения к модели, или на пути к нему) Таким образом, вы будете удалять майора или студента; выбрать свой яд...

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

...major.student.delete... есть ли способ для «студенческого» объекта Activerecord, чтобы узнать, что он был отправлен «удалить» в цепочке методов, начиная с «главного» объекта AR?

Это было полезно?

Решение

Ну, стандартный Restful Atoach - это использовать has_many :through и генерируйте Cotroller для ресурса ассоциации. Ресурсы ассоциации именования всегда сложны, но я попытаюсь для этого примера.

resources :majors do
  resources :studies
  resources :students
end
resources :students do
  resources :studies
  resources :majors
end

Модели были бы, конечно:

class Major < ActiverRecord::Base
  has_many :studies
  has_many :students, :through => :studies
end

и т.д. (комментарий, если вы хотите, чтобы я уточнил)

Тогда для студента вы бы не удалили бы это @student.major но его @student.studies.where :major => @major.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top