2010-04-23 3 views
13

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

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

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» атрибут модели счета и создали динамические атрибуты модели-членов на основе того, что находится внутри. Если club.info_needed был ["first_name", "last_name"], я пытаюсь создать форму, которая сохранит атрибуты first_name и last_name модели Member.

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

+1

Я бы попросил, чтобы вы выбрали мой ответ ниже в качестве ответа, поскольку он более точен, чем текущий выбранный ответ. –

ответ

1

Монгоид на самом деле не поддерживает его.

У меня есть asked это на группе Mongoid.

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

7

Обязательно установите 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 

... 
+0

Да, я сделал это, но у меня все еще были проблемы. Если вы это сделали, и это работает для вас, возможно, мангоид был обновлен, так как я разместил этот вопрос. – joeellis

+1

Недопустимое значение 'allow_dynamic_attributes: true' заключается в том, что оно находится в базе данных и что вы можете загрязнить вашу схему непреднамеренными полями, вызванными ошибками в вашем коде.Вероятно, безопаснее установить это на «false» и сознательно использовать [], [] = – Tilo

26

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

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

[], [] = являются ярлыками для 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") 
+1

. Он удален в 4.0 – monksy

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