好吧,因为出于某种原因,在下面的代码中,我最终得到了表中第一个对象的副本。作业最终应该只有三个对象(数据库中只有3个GA),但由于某种原因,第一个作业会重复。原因是什么?:
@courses = Course.all
@gas = Ga.all
@assignments = Assignment.all
@gas.each do |ga|
this_assignment = Assignment.create(assigned_GA: ga.name, credit_hours: '0')
@courses.each do |course|
if ga.hours >= 20
break
end
if course.gas.empty?
this_assignment.courses << course
this_assignment.save!
this_assignment.credit_hours = this_assignment.credit_hours + course.credit_hours
this_assignment.save!
course.gas << ga
course.save!
ga.hours = ga.hours + course.credit_hours
ga.save!
end
if ga.hours >= 20
break
end
end
this_assignment.save!
@assignments << this_assignment
end
答案 0 :(得分:1)
这是.all
懒惰的待办事项:@assignments
不是数组,而是关系对象。
第一次调用需要加载关系的方法(这包括来自数组的一堆方法,例如collect
)时,rails会执行查询并将结果存储在隐藏的数组中在关系里面。
特别是当您第一次执行@assignments << this_assignment
时会发生这种情况:Rails执行查询,将其存储在数组中,然后调用该数组上的<<
由于this_assignment
已被保留,因此它已存在于数组中,因此您将获得副本。
在循环的后续迭代中,已经加载了关系,因此不会重新获取数据库。
您可以通过更改加载作业的行
来解决此问题@assignments = Assignment.all.load
(如果您需要@assignments作为关系)或
@assignments = Assignment.all.to_a
如果您认为它只是一个普通的数组。