Возможно, вы пытаетесь получить доступ к нему как к методу, подобному Class.attr
, когда вам следует использовать метод доступа к массиву: class['attr']
. Я предполагаю, что даже если это не динамическое поле, правила по-прежнему применяются, поскольку они вложенные и, вероятно, еще не существуют.
Из документов в монгоиде
По умолчанию Mongoid поддерживает динамические поля - то есть он позволяет атрибутам устанавливаться и сохраняться в документе, даже если для них не было определено поле. Однако при работе с динамическими атрибутами в Mongoid есть небольшая «ошибка», поэтому он не совсем снисходительно относится к использованию method_missing и нарушает открытый интерфейс класса Document.
При работе с динамическими атрибутами применяются следующие правила:
Если атрибут существует в документе, Mongoid предоставит вам ваши стандартные методы получения и установки. Например, рассмотрим человека с атрибутом «пол», установленным в документе:
Установите пол человека на мужчину.
person[:gender] = "Male"
person.gender = "Male"
Получить пол человека.
person.gender
Если атрибут еще не существует в документе, Mongoid не предоставит вам методы получения и установки и обеспечит нормальное поведение method_missing. В этом случае вы должны использовать другие предоставленные методы доступа: ([] и [] =) или (read_attribute и write_attribute).
Поднять NoMethodError, если значение не установлено.
person.gender
person.gender = "Male"
Безопасное получение динамического поля.
person[:gender]
person.read_attribute(:gender)
Пишите динамическое поле безопасно.
person[:gender] = "Male"
person.write_attribute(:gender, "Male")
Динамические атрибуты можно полностью отключить, установив для параметра конфигурации Mongoid allow_dynamic_fields значение false.