2010-04-23 17 views
13

Estoy aprendiendo MongoDB a través de la gema Mongoid Ruby con Rails (Rails 3 beta 3), y estoy tratando de encontrar una forma de crear atributos dinámicos en un modelo basado en campos de otro modelo, que pensé que una base de datos sin esquema sería una buena opción.Atributos dinámicos con Rails y Mongoid

Así, por ejemplo, tendría los modelos:

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 

estoy en busca de tomar el atributo "info_needed" del modelo de cuenta y creado atributos dinámicos en el modelo de miembro en base a lo que hay dentro. Si club.info_needed era ["first_name", "last_name"], intento crear un formulario que guarde los atributos first_name y last_name en el modelo de miembro.

Sin embargo, en la práctica, sigo obteniendo "undefined method first_name =" errores en el modelo de miembro cuando intento hacer esto. Sé que MongoDB puede manejar atributos dinámicos por registro, pero ¿cómo puedo hacer que Mongoid haga esto sin un error de método indefinido?

+1

Le pido que seleccione mi respuesta a continuación como respuesta, ya que es más precisa que la respuesta seleccionada actualmente. –

Respuesta

1

Mongoid realmente no lo admite.

Sucede que tengo asked esto en el grupo Mongoid yo mismo.

Es posible cuando se crea nuevo documento, así:

7

Asegúrese de establecer allow_dynamic_fields: true en mongoid.yml. Ejemplo:

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

Sí, lo había hecho, pero todavía tenía problemas. Sin embargo, si ha hecho esto y ha estado trabajando para usted, quizás Mongoid se actualizó desde que publiqué esta pregunta. – joeellis

+1

desventaja de configurar 'allow_dynamic_attributes: true' es que es por base de datos, y que puede contaminar su esquema con campos no deseados, causados ​​por errores en su código.Probablemente sea más seguro configurar esto como 'falso' y usar conscientemente [], [] = – Tilo

26

Mongoid ahora es compatible con campos dinámicos. Su documentación se puede encontrar aquí: http://mongoid.org/en/mongoid/docs/documents.html#dynamic_fields

Básicamente se advierte que hay que ser un poco cuidadoso de cómo haya configurado los campos dinámicos, ya que elevará un error de ningún método si se intenta utilizar los métodos getter y setter para un campo que no existía en el documento.

[], [] = atajos para read_attribute(), write_attribute(), y deben usarse si no se establece dynamic_attributes = true en su ./config/mongoid.yml file, de lo contrario obtendrá un error de ningún método.

La configuración allow_dynamic_fields: true puede ser riesgosa, ya que puede contaminar sus datos/esquemas con campos no deseados causados ​​por errores en su código. Es probable que sea más seguro para establecer este a false y explícitamente utilice [], [] =

# 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

Se ha eliminado en 4.0 – monksy

Cuestiones relacionadas