Ruby Mongoid :: Errors :: InvalidField

时间:2016-05-20 05:20:26

标签: ruby mongoid

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所说,

  

尝试创建与之冲突的字段时会引发此错误   已定义的方法。

如何使用此冲突的名称?

1 个答案:

答案 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_deletedis_deleted=方法,使用[][]=来更新基础属性。