2009-10-17 18 views

Respuesta

6

Lo siento, no sé de ningún plugin para hacer eso. Pero tengo una sugerencia de implementación.

La idea es añadir un modelo "DynamicField", que sería una relación has_many al modelo de contacto. Cuando falta un método en el modelo de contacto, verifica si hay un campo dinámico para recuperarlo si ese es el caso.

class DynamicField < ActiveRecord::Base 
    belongs_to :contact 
end 


class Contact < ActiveRecord::Base 
    has_many :dynamic_fields 

    def method_missing(sym, *args, &block) 
     begin 
      super 
     rescue 
      field = dynamic_fields.find_by_name(sym) 
     end 
     raise ActiveRecord::NoMethodError if field.nil? 
     field.value 
    end 
end 

Usted tendrá que añadir una expresión regular si desea agregar atributos virtuales con el atributo = método (detección de la presencia de un "=" y hacer una actualización en lugar de obtener sólo el valor). Pero ya tienes aquí la idea.

Cuando no existe el método, comprobamos los campos dinámicos si hay uno con el mismo nombre. Si no hay (field.nil?), Levantamos un NoMethodError. De lo contrario, lo devolvemos.

Por lo que podría obtener una lista de todos sus campos con la siguiente:

Contact.find(:first).dynamic_fields 

y recuperar uno específico con lo siguiente:

Contact.find(:first).my_dynamic_field 
2

Ésta es otra manera de hacerlo.

responsabilidad: no se recomienda este método debido a su potencial para el abuso. De hecho, solo debe ser accesible para los administradores de su sitio.

class MyModel < ActiveRecord::Base 
    ... 
    def self.add_column(name, type, args= {}) 
    ActiveRecord::Migration.add_column table_name, name, type, args 
    end 
end 
Cuestiones relacionadas