Динамические атрибуты с Rails и Mongoid - PullRequest
15 голосов
/ 23 апреля 2010

Я изучаю MongoDB через гем Mongoid Ruby с Rails (Rails 3 beta 3), и я пытаюсь придумать способ создания динамических атрибутов в модели на основе полей из другой модели, которую я думал база данных без схемы будет хорошим выбором для.

Так, например, у меня были бы модели:

class Account
  include Mongoid::Document

  field :name, :type => String
  field :token, :type => String
  field :info_needed, :type => Array

  embeds_many :members
end

class Member
  include Mongoid::Document

  embedded_in :account, :inverse_of => :members

end

Я собираюсь взять атрибут "info_needed" модели Account и создать динамические атрибуты в модели Member, основываясь на том, что внутри. Если club.info_needed был ["first_name", "last_name"], я пытаюсь создать форму, которая сохранит атрибуты first_name и last_name в модели Member.

Однако на практике я просто продолжаю получать ошибки "undefined method first_name =" в модели Member при попытке сделать это. Я знаю, что MongoDB может обрабатывать динамические атрибуты для каждой записи, но как мне заставить Mongoid сделать это без неопределенной ошибки метода?

Ответы [ 4 ]

28 голосов
/ 07 апреля 2011

Mongoid теперь поддерживает динамические поля.Их документация может быть найдена здесь: http://mongoid.org/en/mongoid/docs/documents.html#dynamic_fields

В основном, это предупреждает, что вы должны быть немного осторожны при настройке динамических полей, так как это вызовет ошибку отсутствия метода, если вы попытаетесь использовать методы getter и setter дляполе, которого не было в документе.

[], [] = являются ярлыками для read_attribute (), write_attribute () и должны использоваться, если вы не установили dynamic_attributes = true в своем ./config/mongoid.yml fileв противном случае вы получите сообщение об ошибке метода.

Установка allow_dynamic_fields: true может быть рискованной, так как вы можете загрязнить ваши данные / схему непреднамеренными полями, вызванными ошибками в вашем коде.Возможно, безопаснее установить это значение на false и явно использовать [], [] =

# Raise a NoMethodError if value isn't set.
person.gender
person.gender = "Male"

# Retrieve a dynamic field safely.
person[:gender]
person.read_attribute(:gender)

# Write a dynamic field safely.
person[:gender] = "Male"
person.write_attribute(:gender, "Male")
8 голосов
/ 19 мая 2010

Обязательно установите allow_dynamic_fields: true в mongoid.yml. Пример:

defaults: &defaults
  allow_dynamic_fields: true
  parameterize_keys: true
  persist_in_safe_mode: true
  raise_not_found_error: true
  reconnect_time: 3
  use_object_ids: false

development:
  <<: *defaults

...
1 голос
/ 23 июля 2012

интересная статья о динамических атрибутах с Mongoid и Rails 3.1: http://paul -wong-jr.blogspot.com / 2012/03 / dynamic-attribute-and-mongodbmongoid.html

Чтобы получить доступ только к парам динамических ключей / значений или именам динамических атрибутов, см. Также: Список динамических атрибутов в модели Mongoid

1 голос
/ 24 мая 2010

Mongoid действительно не поддерживает это.

Я случайно спросил об этом в группе Mongoid самостоятельно.

Это возможно при создании нового документа, например:

account = Account.new(:some_dynamic_field => "...")

...