2010-04-23 22 views
13

Ich lerne MongoDB über das Mongoid Ruby Juwel mit Rails (Rails 3 Beta 3), und ich versuche, eine Möglichkeit zu finden, dynamische Attribute auf einem Modell basierend auf Feldern zu erstellen ein anderes Modell, für das ich eine schemalose Datenbank für eine gute Wahl hielt.Dynamische Attribute mit Rails und Mongoid

So zum Beispiel, würde ich die Modelle hat:

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 

Ich suche das „info_needed“ Attribut des Kontomodelles und erstellt dynamische Attribute des Mitglieds Modell auf der Grundlage zu nehmen, was drin ist. Wenn club.info_needed ["first_name", "last_name"] war, versuche ich ein Formular zu erstellen, das die Attribute first_name und last_name im Member-Modell speichert.

Allerdings bekomme ich beim Üben immer wieder "undefined method first_name =" Fehler im Member-Modell, wenn Sie dies versuchen. Ich weiß, MongoDB kann dynamische Attribute pro Datensatz verarbeiten, aber wie kann ich Mongoid dazu bringen, dies ohne einen undefinierten Methodenfehler zu tun?

+1

Ich würde bitten, dass Sie meine Antwort unten als die Antwort auswählen, da es genauer als die derzeit ausgewählte Antwort ist. –

Antwort

1

Mongoid unterstützt es nicht wirklich.

Ich habe zufällig asked dies bei Mongoid Gruppe mich.

Es ist möglich, wenn Sie neues Dokument zu erstellen, wie folgt aus:

7

Stellen Sie sicher, dass allow_dynamic_fields: true in mongoid.yml eingestellt ist. Beispiel:

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

Ja, ich hatte das getan, hatte aber immer noch Probleme. Wenn Sie dies getan haben und es für Sie funktioniert hat, wurde Mongoid möglicherweise aktualisiert, seit ich diese Frage gestellt habe. – joeellis

+1

Nachteil der Einstellung 'allow_dynamic_attributes: true' ist, dass es pro Datenbank ist, und dass Sie Ihr Schema mit unbeabsichtigten Feldern belasten könnten, die durch Fehler in Ihrem Code verursacht werden.Wahrscheinlich sicherer, dies auf 'false' zu ​​setzen und bewusst [], [] = – Tilo

26

Mongoid unterstützt jetzt dynamische Felder. Ihre Dokumentation finden Sie hier: http://mongoid.org/en/mongoid/docs/documents.html#dynamic_fields

Grundsätzlich warnt es, dass Sie ein wenig vorsichtig sein müssen, wie Sie dynamische Felder gesetzt, da es eine keine Methode Fehler auslösen, wenn Sie die Getter und Setter-Methoden für ein Feld zu verwenden versuchen, war nicht in dem Dokument vorhanden.

[], [] = sind Abkürzungen für read_attribute(), write_attribute() und sollte verwendet werden, wenn Sie dynamic_attributes = true nicht setzen in Ihrem ./config/mongoid.yml file, sonst werden Sie eine keine Methode Fehler.

Die Einstellung allow_dynamic_fields: true kann riskant sein, da Sie Ihre Daten/Schemata mit unbeabsichtigten Feldern belasten könnten, die durch Fehler in Ihrem Code verursacht werden. Es ist wahrscheinlich sicherer zu setzen, dies zu false und [explizit benutzen], [] =

# 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

zu verwenden. Es wurde in 4.0 entfernt – monksy

Verwandte Themen