Можно ли использовать mongoid "вложенные атрибуты" со стороны принадлежащей стороны отношения один ко многим? - PullRequest
2 голосов
/ 20 декабря 2011

Можно ли использовать монгоид " вложенные атрибуты " со стороны принадлежащей стороны к взаимно-однозначному отношению?

Пример:

class Bar1
  include Mongoid::Document

  belongs_to :bar2

  accepts_nested_attributes_for :bar2
end

Когда я пытаюсь получить доступ к вложенным атрибутам, я получаю следующее исключение: NoMethodError: неопределенный метод `bar2_attributes '

Моя основная цель - использовать функцию «Вложенные атрибуты» для кэширования свойств ссылочных документов.

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

Я снова прочитал документы и теперь понимаю, что для сохранения данных используются «атрибуты netsted». И не может использоваться для кэширования ссылочного документа.

1 голос
/ 21 декабря 2011

Возможно, вы пытаетесь получить доступ к нему как к методу, подобному 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.

...