为什么 mongoid 在使用变量时不允许创建新的嵌入式文档



我正在尝试在删除嵌入文档后添加新的嵌入文档。但是当我使用时出现错误:

法典

u = User.last
u.classes.destroy_all
u.classes.create(:name => "Philsophy")
=> NoMethodError: undefined method `create' for []:Array

但是,如果我不使用变量,它可以工作。 有人可以向我解释一下吗?我需要使用嵌套变量版本来循环访问包含数百个项目的结果集。

User.last.classes.destroy_all
User.last.classes.create(:name => "Philsophy")
=> #<Class _id: philosophy, name: "Philosophy"> 

Ruby on Rails 3.0.3
Mongoid 2.0.0.beta.20 (这里别无选择)

谢谢

我不确定您的模型到底是什么,但我只能重现您遇到的错误:

class User
  include Mongoid::Document
  embeds_many :classes
end
class Class
  include Mongoid::Document
  field :name
  embedded_in :user, :inverse_of => :classes
end

如果这就是你所拥有的,那么问题是你正在从 Ruby 标准库中打开类类并有效地将其扩展为 Mongoid 模型。我想这不是故意的。在这种情况下,您有几个选择,您可以将 Class 类重命名为不会与标准库冲突的内容,例如这工作正常:

class User
  include Mongoid::Document
  embeds_many :courses
end
class Course
  include Mongoid::Document
  field :name
  embedded_in :user, :inverse_of => :courses
end

或者,如果您真的想将类称为"Class",则可以将模型放在命名空间中:

module Models
  class User
    include Mongoid::Document
    embeds_many :classes, :class_name => 'Models::Class'
  end
  class Class
    include Mongoid::Document
    field :name
    embedded_in :user, :inverse_of => :classes, :class_name => 'Models::User'
  end
end

如果你这样做,那么你将不得不给Mongoid一些帮助,通过指定class_name来找到每个关系中的目标类。所以可能最容易重命名类。

至于为什么只有当你使用第一个示例中的变量时才会出现问题,我怀疑这是因为 destroy_all 方法使类集合处于损坏状态(名称冲突的副作用)。在第二个示例中,第二行加载用户模型的新实例,因此不会出现此问题。

最新更新