将数据提取到MongoDB会导致“堆栈级别太深”

时间:2012-05-15 23:06:23

标签: ruby-on-rails mongodb mongomapper

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

task :parse_student_records => :environment do
  StudentRecord.all.each{|student_record|
    student = Student.create({:name => student_record.name})
    student.grades « Grade.create({:score => student_record.grade_score)
    student.save!
  }
end


class Student
  include MongoMapper::Document
  many :grades
  key :name, String
end

class Grade
  include MongoMapper::EmbeddedDocument
  key :grade_score, String
end

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

1 个答案:

答案 0 :(得分:2)

那是issue 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