class MyModule::MyModel
include Mongoid::Document
field :field1, :type=>Integer
...
field :fieldn, :type=>Integer
field :deleted, :type=>Boolean
store_in session: 'mydb', collection: 'mycollection'
end
这些代码在Mongoid::Errors::InvalidField
定义时抛出了:deleted
。如果我删除此行,则效果很好。
/var/lib/gems/2.1.0/gems/mongoid-4.0.0/lib/mongoid/fields/validators/macro.rb:56:in `block in validate_name': (Mongoid::Errors::InvalidField)`
正如http://www.rubydoc.info/github/mongoid/mongoid/Mongoid/Errors/InvalidField所说,
尝试创建与之冲突的字段时会引发此错误 已定义的方法。
如何使用此冲突的名称?
答案 0 :(得分:-1)
当我尝试添加deleted
字段时,Mongoid 4.0.2说:
Problem:
Defining a field named 'deleted?' is not allowed.
Summary:
Defining this field would override the method 'deleted?', which would cause issues with expectations around the original method and cause extremely hard to debug issues. The original method was defined in:
...
当你说:
field :f
Mongoid为该字段创建三种方法:f
(getter),f=
(setter)和f?
(f
truthy据我所知)。最后一个导致您的问题,因为Mongoid有自己的deleted?
方法。
您最好的选择是为该字段使用不同的名称,field :is_deleted
或许。
如果你不能这样做(即你将Mongoid附加到预定义的集合),那么你可以使用动态属性:
class MyModule::MyModel
include Mongoid::Document
include Mongoid::Attributes::Dynamic
field :field1, :type=>Integer
...
field :fieldn, :type=>Integer
# Don't define the field here
store_in session: 'mydb', collection: 'mycollection'
end
然后您可以使用Mongoid的[]
和[]=
方法访问它:
d = MyModule::MyModel.new
d[:deleted] = true
d = MyModule::MyModel.find(id)
puts d[:deleted]
puts d.attributes['deleted']
您还可以添加自己的is_deleted
和is_deleted=
方法,使用[]
和[]=
来更新基础属性。