2016-05-20 5 views
0
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 определению. Если я удалю эту строку, она будет работать хорошо.рубина Mongoid :: Ошибки :: InvalidField

/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

Когда я пытаюсь добавить 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 (поглотитель), f= (сеттер) и f? (есть f правша AFAIK). Последнее вызвало вашу проблему, потому что у 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= методы, которые могли бы использовать [] и []= обновить базовый атрибут.

Смежные вопросы