0

我想要做以下事情:事件既可以让个别学生参与竞争,也可以让学生团队参与。所以我把它多态,如下:如何资源管理与关联模型的多态关联?

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;博士:我怎样使用这些资源型控制器的工作?

我已经有一个事件控制器,它允许我删除它的属性。我有一个学生管理员也是这样做的。所以现在我需要竞争对手控制器来组合它们。在那里,我画了一个空白。

我想要的是能够在一个屏幕上选择一个事件竞争对手 - 从学生复选框列表中。如果我创建像

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_forsimple_form_for(@event, @competitors)并将其构建的路径更新行动。

基本上,我不知道如何最好地去做这一切。我是否过于严格,坚持资源?感谢您的帮助。

回答

0

我用一个单一的资源:

resources :events, shallow: true do 
    resource :student_competitors, shallow: true 
end 

因此我可以在events/1/student_competitors编辑学生的竞争对手,我用simple_form_for为:

<%= simple_form_for(:student_competitors, url: event_student_competitors_path, :method => :put, :html => { :class => 'form-vertical' }) do |f| %>