我在删除嵌入文档后尝试添加新的嵌入文档。但是当我使用时出现错误:
代码
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(这里没有选择)
由于
答案 0 :(得分: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模型的新实例,以便不会出现问题。