我有一堆存储在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
将文档作为独立文档而不是嵌入文档进行摄取会修复它...出于某种原因,嵌入会导致问题。
答案 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