3

好的,这是一个示例场景。有一个学生资源resources :students,学生拥有并属于许多收藏:resources :clubsresources :majors等。

所以我们可以很容易地设置我们的路线......

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

它为我们生成了一堆标准的 RESTful 路由

  • /俱乐部
  • /俱乐部/:身份证
  • /clubs/:club_id/学生
  • /clubs/:club_id/students/:id
  • /专业
  • /专业/:id
  • /majors/:major_id/学生
  • /majors/:major_id/students/:id
  • /学生
  • /学生/:身份证
  • /students/:student_id/clubs
  • /students/:student_id/clubs/:id
  • /students/:student_id/专业
  • /students/:student_id/majors/:id

所以这是我的问题。使用 REST 语义,如何删除学生的专业?浏览专业下的学生/majors/:major_id/students/:id将显示该学生在特定专业的“收藏”中。但是删除 :id 的路径指向StudentsController#destroy,这将完全删除学生。哎呀!所以也许我们走另一条路,对资源执行 DELETE,/students/:student_id/majors/:id现在这所学校不再提供 UnderwaterBasketweaving……哎呀!

现在,我们可以设置 ClubsController、MajorsController 或 StudentsController 的 destroy 方法来查找 club_id、major_id 或 student_id,但假设我们还想添加 Fraternities 和 GraduatingClasses 等。每个类都将开始由巨大的开关条件组成,以查看存在什么参数...然后找到顶部资源的集合并删除底部资源,反之亦然。如果模型没有更多的关联记录,他们自己应该决定是否删除自己......对该资源的“销毁”已经成为一个用词不当......

有没有更简单的方法来做到这一点?甚至流行的 restful rails 插件也喜欢make_resourcefulresource_controller会在从 Joe's Majors 中删除 UnderwaterBasketweaving 时将其吹走,或者在将 JohnDoe 从主要的 UnderwaterBasketweaving 中删除时完全删除他。似乎有可能查看关联以了解语义的预期效果以及“破坏”应该做什么。

再说一次,我看这一切都错了吗?不是 UnderwaterBasketweaving -> Joe 而是 UnderwaterBasketweaving+Joe 作为单一资源,我们要删除的确实不是 Joe,也不是 UnderwaterBasketweaving,而是代表组合的资源?但是,当控制器是 Student 和 Majors 时,这并不容易,这实际上代表了同名的资源(MVC 已经真正成为 RV ......在“约定”方法中,而不是开发可能与模型名称无关的控制器,或到达它的路径)因此您将删除专业或学生;选择你的毒药...

我如何避免在关联资源的无限图上管理条件,当删除确实不是意图时,删除是在集合的上下文中而不是与它的奇点有关...?

... major.student.delete... 有没有办法让“学生”ActiveRecord 对象知道它在以“主要”AR 对象开头的方法链中发送了“删除”消息?

4

1 回答 1

2

那么标准的 RESTful 方法是使用has_many :through和生成关联资源的控制器。命名关联资源总是很困难,但我会尝试这个例子。

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.

于 2010-11-07T15:08:37.650 回答