在我的表中获取重复值。不知道为什么

时间:2016-03-12 05:48:39

标签: ruby-on-rails ruby

好吧,因为出于某种原因,在下面的代码中,我最终得到了表中第一个对象的副本。作业最终应该只有三个对象(数据库中只有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

1 个答案:

答案 0 :(得分:1)

这是.all懒惰的待办事项:@assignments不是数组,而是关系对象。

第一次调用需要加载关系的方法(这包括来自数组的一堆方法,例如collect)时,rails会执行查询并将结果存储在隐藏的数组中在关系里面。

特别是当您第一次执行@assignments << this_assignment时会发生这种情况:Rails执行查询,将其存储在数组中,然后调用该数组上的<<

由于this_assignment已被保留,因此它已存在于数组中,因此您将获得副本。

在循环的后续迭代中,已经加载了关系,因此不会重新获取数据库。

您可以通过更改加载作业的行

来解决此问题
@assignments = Assignment.all.load 

(如果您需要@assignments作为关系)或

@assignments = Assignment.all.to_a

如果您认为它只是一个普通的数组。