2

mongodb コレクション (StudentRecord) に多数のレコードが格納されています。これらは、埋め込みドキュメントの StudentGrade を使用して Student タイプの Collection に分割する必要があります。何らかの理由で、この取り込みを行うために使用しているレーキ タスクが「スタック レベルが深すぎます」に達し続けます。再帰呼び出しを検出できず、bundle exec を使用して実行しています (ruby 1.9.2-p320)。

タスク :parse_student_records => :環境 do
  StudentRecord.all.each{|student_record|
    student = 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

これはissue 265で、私が番号で知っている数少ないものの 1 つです。

埋め込みドキュメントでコールバックを正しい順序で起動するには、MongoMapper は、埋め込みドキュメントの数に比例して増加する巨大なスタックを構築する必要があります。約 600 ~ 800 ドキュメントで、スタックがオーバーフローします。

ActiveSupport::Callbacksこれは非常に厄介であり、問​​題を完全に回避するには書き直す必要があります (Rails の頭の中ではあまり混乱していませんが、それでも書き直す必要があります)。

issue 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 に答える