2012-05-15 46 views
2

我有一堆存儲在MongoDB集合(StudentRecord)中的記錄。需要將這些內容分解爲嵌入式文檔StudentGrade的Student類型集合。出於某種原因,我用來執行這個攝取的耙子任務會一直打到「堆棧層次太深」。我無法檢測到任何遞歸調用,並使用bundle exec來執行它(ruby 1.9.2-p320)。將數據導入到MongoDB導致「堆棧級別太深」

 
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 

將文檔作爲獨立文檔而不是嵌入文檔修復它。由於某種原因,嵌入導致了問題。

回答

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 
+0

非常感謝你識別這個問題。浪費了一整天的時間讓這個工作。我已經按照線程中的建議嘗試了MM 0.8.6,但遇到了其他問題。很可能最終會等待上述修復加入更新版本。再次感謝 – udit

+0

男人!你是一個拯救生命的人! – hugalves