我正在尝试做以下事情:活动可以让个别学生参加比赛,也可以让学生组成团队。所以我多态地设置了它,如下:
class Event < ActiveRecord::Base
belongs_to :event_type
has_many :competitors
has_many :students, through: :competitors, :source => :participant, :source_type => 'Student'
end
class Competitor < ActiveRecord::Base
belongs_to :event
belongs_to :participant, polymorphic: true
# also has other attributes, like points, and grade
end
class Student < ActiveRecord::Base
has_many :competitors, :as => :participant
has_many :events, :through => :competitors
end
class Team < ActiveRecord::Base
has_many :competitors, :as => :participant
has_many :events, :through => :competitors
has_many :team_members
has_many :students, :through => :team_members
end
tl;dr:我如何使用 Resourceful 控制器来处理这些?
我已经有一个事件控制器,它允许我对它的属性进行 CRUD。我有一个可以做同样事情的学生控制器。所以现在我需要竞争对手控制器来组合它们。在那里我画了一个空白。
我想要的是能够在一个屏幕上选择一个事件竞争对手 - 从学生复选框列表中。如果我创建一个嵌套路由
resources :events, shallow: true do
resources :competitors, shallow: true
end
然后我可以去events/1/competitors
显示竞争对手的名单。但它应该显示团队还是学生?我不希望它变得一团糟。那么我应该为这两个设置单独的控制器吗?他们将如何命名?我将如何与他们互动?
假设我专门为学生竞争对手制作了一个控制器:
resources :events, shallow: true do
resources :student_competitors, shallow: true
end
我会得到events/1/student_competitors
。这将显示参加该活动的所有学生的列表。假设我想让该列表成为一组带有更新按钮的复选框。我将如何构建该表单?
<%= simple_form_for(@event, :html => { :class => 'form-vertical' }) do |f| %>
<% @students.each do |student| %>
<%= check_box_tag "event[student_ids][]", student.id, student.events.include?(@event) %>
<span><%= student.name %></span>
<% end %>
<%= f.button :submit, 'Update Competitors' %>
<% end %>
这会将表单提交回events/1
,而我希望将其提交给 StudentCompetitors 控制器,但我不能simple_form_for
使用像这样的集合调用simple_form_for(@event, @competitors)
并让它构建更新操作的路径。
本质上,我不确定如何最好地处理这一切。我是否试图过于严格,坚持资源?感谢您的帮助。