Ruby on rails 嵌套模型,设置多个属性,有些相同,有些不同
在我的Rails应用程序中,我有三个嵌套模型:一个有许多学生的教室,以及学生有许多作业。作业有Ruby on rails 嵌套模型,设置多个属性,有些相同,有些不同,ruby-on-rails,ruby,Ruby On Rails,Ruby,在我的Rails应用程序中,我有三个嵌套模型:一个有许多学生的教室,以及学生有许多作业。作业有名称和等级 在添加作业时,我如何列出所有学生,并在每个学生旁边设置一个输入框,用于输入他们各自的分数?我还需要一个输入框,可以为所有学生设置相同的作业名称。因此,分配给每个人的name都是相同的,但每个人都有自己的grades设置 我列出了所有的学生,但现在他们有两个输入框,name和grade,用于每个学生。我只需要一个盒子来做作业,每个学生旁边的年级都需要一个盒子,所有的表格都是一样的 顺便说一句,
名称
和等级
在添加作业时,我如何列出所有学生,并在每个学生旁边设置一个输入框,用于输入他们各自的分数?我还需要一个输入框,可以为所有学生设置相同的作业名称。因此,分配给每个人的name
都是相同的,但每个人都有自己的grade
s设置
我列出了所有的学生,但现在他们有两个输入框,name
和grade
,用于每个学生。我只需要一个盒子来做作业,每个学生旁边的年级都需要一个盒子,所有的表格都是一样的
顺便说一句,我在使用嵌套表单。这可能吗?所有学生完成相同的“作业”,但获得不同的“分数”,但在您的模式中,您似乎有作业作为作业和分数的双重职责,这可能是一个错误。事实上,您将有许多具有相同名称的作业
,这是您的模式不理想的一个重要线索。相反,如果我们将作业和等级视为两个独立的事物,那么嵌套就变得更自然:
class Student < ActiveRecord::Base
belongs_to :classroom
has_many :grades
has_many :assignments, through: :grades
end
class Grade < ActiveRecord::Base
belongs_to :student
belongs_to :assignment
# attributes: `score`
end
class Assignment < ActiveRecord::Base
has_many :students, through: :classroom
belongs_to :classroom
# attributes: `name`
accept_nested_attributes_for :grades
# a method to initialize a Grade for each Student in the associated Classroom
# (doesn't assign a score or save the Grade yet)
def build_grades_for_classroom_students
students.each {|student| grades << student.grades.build }
grades
end
end
(其中,*
表示一个的“多”端有多个
关系,例如,“学生有多个
成绩,..
是一个通过
关系有多个.)
这将为您的用例提供很大的灵活性,并允许您在AssignmentsController中执行类似的操作(希望不用说,但是:这都是未经测试的,如果您只是复制和粘贴,将无法工作):
在你看来,类似这样的事情:
Student
.* | *
. * \
. Grade Classroom
. * /
. | *
Assignment
<%= form_for [@classroom, @assignment] do |f_a| %>
<%= f_a.label :name %>
<%= f_a.text_field :name %>
<%= f_a.fields_for :grades do |f_g| %>
<%= f_g.label :score do %>
Grade for <%= f_g.object.student.name %>
<% end %>
<%= f_g.text_field :score %>
<% end %>
<%= f_a.submit %>
<% end %>
等级
(将此应用于茧宝石留给您,因为我从未使用过它。)
我敢肯定,这有很多东西需要消化,但我希望能有所帮助。谢谢你的帮助!我肯定这是正确的方向。我以前不知道有多少经历。有几个问题。指定接受:等级的嵌套属性,但与它们没有关联,除了:至?这样可以吗?它为我抛出了一个错误,并在添加:has_many:grades时消失了。此外,将表单_用于[@教室,@assignment]会抛出错误“未定义的方法`教室_assignments_path”。在我的路由器中,我有这两个方面的资源。好吧,我想我已经开始工作了,现在使用“form_for@assignment”,在“f_a.fields_for:grades”下的一个隐藏字段中添加了“student_id”。由于我必须允许所有这些参数,“assignment=classification.assignments.build(params[:assignment])”不起作用,但“@assignment=@classification.assignments.new assignment_params”起作用。似乎所有人都在工作了!我会继续接受答案,因为没有它我就找不到解决方案。
<%= form_for [@classroom, @assignment] do |f_a| %>
<%= f_a.label :name %>
<%= f_a.text_field :name %>
<%= f_a.fields_for :grades do |f_g| %>
<%= f_g.label :score do %>
Grade for <%= f_g.object.student.name %>
<% end %>
<%= f_g.text_field :score %>
<% end %>
<%= f_a.submit %>
<% end %>