2012-07-02 131 views
0

Helo,我一直坚持这个问题。 只是为了让事情变得简单,我会把它解释得更简短。在一对一的关系上创建多个对象

Student has_many :grades 
     belongs_to :class 

Grade belongs_to :student 
     belongs_to :rubric 

Rubric belongs_to :course 
     has_many :students, :through => :class 

要创建新的成绩,我们需要找到存在的学生。我们可以打电话给@ class.students来这样做。此外,应使用rubric_id创建等级。

我已经找到了如何做嵌套窗体。但是如何将复数的学生身份证传递到新的成绩?

如何建立控制器和视图来做到这一点?

+0

我不认为你的模型设置正确,以实现这一点。在你所问的场景中,学生和成绩似乎处于多对多的关联中。即一个学生有很多标题,但是一个标题有很多学生,都是通过评分(这是你的关联模式)。我理解这个正确吗? – yuklai

+0

即, 类的has_many:学生 的has_many:栏目,:通过=>:级 学生的has_many:栏目,:通过=>:栏目 belongs_to的:类 #A级是分配给学生特定类的特定量规 级belongs_to的:学生 belongs_to的:专栏 belongs_to的:类 专栏belongs_to的:当然 的has_many:学生:通过=>:专栏 让我知道如果我上面的解释是正确的,我可以在一个答案跟进控制器和视图。我最近为另一个项目做了非常类似的事情。 – yuklai

回答

0

(阿根廷,我不能正确格式化我的问题的意见,所以我必须使用一个答案。小熊请与我,因为我不认为这回答你的问题呢。)

我不不认为你的模型设置正确,以实现这一点。在你所问的场景中,学生和成绩似乎处于多对多的关联中。即一个学生有很多标题,但是一个标题有很多学生,都是通过评分(这是你的关联模型)。我理解这个正确吗?

Class has_many :students 
     has_many :grades 
     has_many :rubrics, :through => :grade 

Student has_many :grades 
     has_many :rubrics, :through => :grade 
     belongs_to :class 

# A grade is a particular rubric assigned to a student for a particular class 
Grade belongs_to :student 
     belongs_to :rubric 
     belongs_to :class 

Rubric belongs_to :course 
     has_many :grades 
     has_many :students, :through => :grade 

让我知道如果我上面的解释是正确的,我可以用控制器和视图上的答案跟进。我最近为另一个项目做了非常类似的事情。

编辑:现在我们已经澄清了这个问题,这里是我的建议答案。 目标是为多个学生分配特定课程中的标准。

没有内置的方法来支持这样的事情,所以我们将不得不建立记录和与正确的控制器行为和表单的关联。

在等级模型中,我们添加此功能: DEF self.checked(类标识码,student_id数据,rubric_id) Grade.find(?:全部:条件=> {:=类标识码>类标识码,:student_id数据=> student_id数据, :rubric_id => rubric_id})。present? 结束

在的form_for:在RubricsController的创建行动

<%= form_for @rubric do |f| %> 
    <% for @class.students.each do |student| %> 
    <%= fields_for :grades do |builder| %> 
    <%= check_box_tag "grades[" + @class.id.to_s + "][]", rubric.id, Grade.checked?(@class.id, student.id, @rubric.id) %> 
    <% end %> 
    <%= f.submit "Save" %> 
<% end %> 

现在,你应该有一个PARAMS:专栏中,我们创造这样的事情[:等级]这是关键的哈希[:类]其价值应该只是一系列学生ID。现在,您可以创建与这些模型关联的成绩对象,因为您拥有一个标题ID(@ rubric.id),一个类ID(@ class.id)和一组学生ID。

我希望我没有拧上面的代码,因为我不得不从我目前的实施中改变它。但是查看rails服务器的控制台日志应该可以让你找出提交上面的表单并进行调整时传递的参数。

+0

感谢您的快速回复。 你的解释基本上是正确的,除了 学生has_many:rubric,:through =>:rubric。 它应该是:年级,:通过=>:rubric 只是为了确保:例子的专栏:Class_id:“5”,名称:“作文1”,max_grade =“15”。等级示例:student_id =“54”,评价= 10。 – zgalem

+0

对不起,我似乎在我原来的解释中犯了一些错误。我编辑了上述内容。你能看出这是否正确?它听起来不同于上面的评论。主要是,你提到Student has_many:grade,:through =>:rubric。 – yuklai

+0

现在看起来不错,除了:class has_many:rubrics(without:through option) – zgalem