1

我有一个模型evaluation,称为另外belongs_to两个模型 -studentgoal.

在研究如何为路由设置此关联时,起初我认为多态关联最好,但现在我不太确定。我对多态关系的理解不是那么牢固,所以如果我错了请纠正我,但在我的情况下似乎evaluations可以belong_to studentgoal同样,但这并不是我真正想要的。

事实上,同时给定evaluation belong_toastudent a是很重要的goalRails 路由指南特别提到拥有三重嵌套资源不是一个好主意:

导轨布线指南

然而,即使是这个警告也没有帮助,因为在这个例子photos belong_to magazines中反过来belong to publishers- 而在我的情况下evaluations应该belong_to两者studentsgoals

我试过了

resources :students, :goals do 
  resources :evaluations
end

students/evaluations但这只会为和创建资源goals/evaluations- 所以我的问题是:

如何路由到具有同等权重属于两个父模型的嵌套资源(我只需要创建、更新和销毁操作,因为evaluations只会在一个/两个父模型的上下文中查看)?

或者

我是否应该使用多态关联来执行此操作,而我只是没有正确理解它?

4

2 回答 2

1

我会使用多态:

路线.rb

resources :students do
  resources :evaluations
end

resources :goals do
  resources :evaluations
end

模型/评估.rb

class Evaluation < ActiveRecord::Base
  attr_accessible :some_attribute
  belongs_to :evaluable, polymorphic: true
end

模型/学生.rb

class Student < ActiveRecord::Base
  attr_accessible :some_attribute
  has_many :evaluations, as: :evaluable
end

模型/目标.rb

class Goal < ActiveRecord::Base
  attr_accessible :some_attribute
  has_many :evaluations, as: :evaluable
end

您的目标和学生之间的关系将如下所示:

id    evaluable_id  evaluable_type    other_field
 1               4       'Goal'         'other goal content 1'
 2               1       'Student'      'other student content 1'
 3               1       'Student'      'other student content 2'

现在您可以致电:

Student.find(1).evaluations

将返回 id 为 2 和 3 的评估,因为它们有 evaluable_type = Student 其中 evaluable id = 1。或者:

Goal.find(4).evaluations

将返回 id 为 1 的评估,猜猜为什么。:) 是的,使用多态关联。

于 2013-08-07T12:46:25.263 回答
0

虽然rmagnum2002对使用多态关联的解决方案给出了非常好的答案,但我无法让它为我工作。最后,我一直保持着evaluations归属感goalsstudents双重性。至于路由,我的相关部分routes.rb如下所示:

resources :students, :goals, :only => :stub do
  resources :evaluations, :only => [:new, :create, :edit, :update, :destroy]
end  

并生成:

student_evaluations POST   /students/:student_id/evaluations(.:format)                   evaluations#create
new_student_evaluation GET    /students/:student_id/evaluations/new(.:format)               evaluations#new
edit_student_evaluation GET    /students/:student_id/evaluations/:id/edit(.:format)          evaluations#edit
student_evaluation PUT    /students/:student_id/evaluations/:id(.:format)               evaluations#update
                       DELETE /students/:student_id/evaluations/:id(.:format)               evaluations#destroy
goal_evaluations POST   /goals/:goal_id/evaluations(.:format)                         evaluations#create
new_goal_evaluation GET    /goals/:goal_id/evaluations/new(.:format)                     evaluations#new
edit_goal_evaluation GET    /goals/:goal_id/evaluations/:id/edit(.:format)                evaluations#edit
goal_evaluation PUT    /goals/:goal_id/evaluations/:id(.:format)                     evaluations#update
                       DELETE /goals/:goal_id/evaluations/:id(.:format)                     evaluations#destroy

最重要的是在数据库中生成一个评估模型,如下所示:

数据库视图

所以对于每一个evaluation都有一个相应的goal_id student_id同时的。

于 2013-08-15T16:22:52.857 回答