2

我有一堆记录存储在 mongodb 集合(StudentRecord)中。这些需要分解为具有嵌入式文档 StudentGrade 的 Student 类型的集合。出于某种原因,我用来执行此摄取的 rake 任务不断达到“堆栈级别太深”。我无法检测到任何递归调用,我正在使用 bundle exec 来执行它(ruby 1.9.2-p320)。

任务:parse_student_records =>:环境做
  StudentRecord.all.each{|student_record|
    学生 = Student.create({:name => student_record.name})
    student.grades « Grade.create({:score => student_record.grade_score)
    学生。保存!
  }
结尾


班级学生
  包括 MongoMapper::Document
  许多:等级
  键:名称,字符串
结尾

班级成绩
  包括 MongoMapper::EmbeddedDocument
  键:grade_score,字符串
结尾

将文档作为独立文档而不是嵌入文档来修复它..由于某种原因,嵌入会导致问题。

4

1 回答 1

2

那是第 265期,是我知道的为数不多的数字之一。

为了让回调以正确的顺序触发嵌入文档,MongoMapper 必须构建一个巨大的堆栈,该堆栈随着嵌入文档的数量线性增长。在大约 600-800 个文档时,堆栈溢出。

ActiveSupport::Callbacks是一个巨大的混乱,需要重写才能干净地避开问题(它在 Rails 头上不那么混乱,但仍然需要重写)。

问题 265 中的当前提案是禁用回调。

# in Gemfile
gem 'mongo_mapper', :git => 'git://github.com/jnunemaker/mongomapper.git', :ref => 'fefec91027f2dd8eb1ab9caa5a4b0acd000f4da7'

进而:

class Student
  include MongoMapper::Document
  embedded_callbacks_off
  # ...
end
于 2012-05-16T14:01:03.383 回答