ruby-on-rails - 将数据引入 MongoDB 导致 "stack level too deep"

标签 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

将文档作为独立文档而不是嵌入文档来解决问题。由于某种原因,嵌入导致了问题。

最佳答案

那是 issue 265 ,我知道的为数不多的几个人之一。

为了让回调以正确的顺序触发嵌入式文档,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

关于ruby-on-rails - 将数据引入 MongoDB 导致 "stack level too deep",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10610025/

相关文章:

python - 在python3中将嵌套对象插入mongodb(嵌套对象是一个类实例)

javascript - 将 MongoDB 中的字符串转换为日期

mongodb - 如何在 Linux mint 中启动 mongodb?

ruby-on-rails - 让 Gmaps4Rails 与 MongoMapper 一起工作

ruby-on-rails - Rails 无法识别从 Ruby 脚本发布的参数

ruby-on-rails - RubyMine 不能使用 Guard 吗?

ruby-on-rails - Rails + Sidekiq : Sidekiq running in wrong environment

ruby-on-rails - 卸载并重新安装 Ruby 和 Rails 后,为什么找不到它?

mongodb - 使用 MongoMapper 范围查询关联集合?

ruby-on-rails - 关于从 MongoMapper 迁移到 Mongoid 的建议?