Ответ 1
Монгоид на самом деле не поддерживает его.
Кажется, спросил об этом в группе Mongoid.
Это возможно при создании нового документа, например:
account = Account.new(:some_dynamic_field => "...")
Я изучаю MongoDB с помощью монгольского Ruby gem с 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 метода first_name = "в модели Member при попытке сделать это. Я знаю, что MongoDB может обрабатывать динамические атрибуты на запись, но как я могу заставить Mongoid сделать это без ошибки метода undefined?
Монгоид на самом деле не поддерживает его.
Кажется, спросил об этом в группе Mongoid.
Это возможно при создании нового документа, например:
account = Account.new(:some_dynamic_field => "...")
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")
Обязательно установите 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
...
интересная статья о динамических атрибутах с Mongoid и Rails 3.1: http://paul-wong-jr.blogspot.com/2012/03/dynamic-attributes-and-mongodbmongoid.html
Чтобы получить доступ только к динамическим ключевым парам/значениям или динамическим именам атрибутов, см. также: Список динамических атрибутов в модели Mongoid