Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 嵌套模型,设置多个属性,有些相同,有些不同_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 嵌套模型,设置多个属性,有些相同,有些不同

Ruby on rails 嵌套模型,设置多个属性,有些相同,有些不同,ruby-on-rails,ruby,Ruby On Rails,Ruby,在我的Rails应用程序中,我有三个嵌套模型:一个有许多学生的教室,以及学生有许多作业。作业有名称和等级 在添加作业时,我如何列出所有学生,并在每个学生旁边设置一个输入框,用于输入他们各自的分数?我还需要一个输入框,可以为所有学生设置相同的作业名称。因此,分配给每个人的name都是相同的,但每个人都有自己的grades设置 我列出了所有的学生,但现在他们有两个输入框,name和grade,用于每个学生。我只需要一个盒子来做作业,每个学生旁边的年级都需要一个盒子,所有的表格都是一样的 顺便说一句,

在我的Rails应用程序中,我有三个嵌套模型:一个有许多学生的教室,以及学生有许多作业。作业有
名称
等级

在添加作业时,我如何列出所有学生,并在每个学生旁边设置一个输入框,用于输入他们各自的分数?我还需要一个输入框,可以为所有学生设置相同的作业名称。因此,分配给每个人的
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 %>