1

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

代码

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(这里别无选择)

谢谢

4

1 回答 1

0

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

class User
  include Mongoid::Document

  embeds_many :classes
end

class Class
  include Mongoid::Document
  field :name

  embedded_in :user, :inverse_of => :classes
end

如果这是您所拥有的,那么问题是您正在从 Ruby 标准库中打开 Class 类并有效地将其扩展为 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 方法使类集合处于损坏状态(名称冲突的副作用)。在您的第二个示例中,第二行正在加载 User 模型的新实例,这样就不会出现问题。

于 2012-06-03T09:48:22.087 回答