2009-10-02 11 views
14

Estoy accediendo a una base de datos que no puedo cambiar y tiene una columna llamada válida definida. Cada vez que intento acceder a un atributo, aparece esta excepción:¿Cómo puedo usar ActiveRecord en una base de datos que tiene una columna llamada 'válida'? (DangerousAttributeError)

¿válido? se define por ActiveRecord (ActiveRecord :: DangerousAttributeError)

La excepción tiene sentido, pero como yo no soy capaz de cambiar la base de datos, ¿cómo puedo solucionar este error?

Intenté "anular" el atributo, pero no sé cómo eliminar la columna original. Puedo llamar con éxito a este método valid_column, pero cada vez que intento acceder a otro atributo definido en la base de datos, obtengo la misma excepción. Todavía parece estar intentando mapear la columna válida.

def valid_column=(valid) 
    write_attribute(:valid, valid) 
    end 
    def valid_column 
     read_attribute(:valid) 
    end 

no estoy seguro si importa, pero aquí están los detalles de mi entorno:

  • de Windows de Ruby 1.8.6
  • base de datos Informix en un servidor Linux
  • activerecord (2.3.4)
  • activerecord-Informix-adaptador (1.0.0.9250)
  • rubí Informix (0.7.1)

¡Gracias de antemano!

Respuesta

11

Prueba esto:

class MyTable < AR:Base 
    class << self 
    def instance_method_already_implemented?(method_name) 
     return true if method_name == 'valid' 
     super 
    end 
    end 
end 

Es un truco, y podría no funcionar en los carriles 3, pero podría solucionar el problema por ahora.

me encontré en el ruby on rails mailing list

Si desea, también se puede mirar a datamapper, que se ocupa de este tipo de cosas un poco más sanamente.

+1

Es posible que tenga que cambiar 'devolver cierto si method_name == 'valid'' a' return true si method_name == 'válida?'' Con el fin de conseguir que funcione. Yo si. –

+0

El signo de interrogación parece ser necesario en los carriles 3. – Kelvin

3

Para las lecturas, es posible que pueda utilizar la declaración de selección de SQL. No estoy seguro de si funcionará lo siguiente, pero un alcance predeterminado puede hacer que esto sea fácilmente factible.

class MyRecord < ActiveRecord::Base 
    default_scope :select=> 'valid as valid_column' 
end 
4

Use los atributos de seguridad - https://github.com/bjones/safe_attributes. Funciona perfectamente fuera de la caja:

class WebsiteUser < ActiveRecord::Base 
    establish_connection 'cf_website' 
    set_table_name 'nc_users' 
    bad_attribute_names :hash  
end 
3

Sin tener que preocuparse acerca de los atributos de ActiveRecord reservados, basta con añadir una joya en su Gemfile y la gema se encargará de conflictos de nombres de forma automática.

gem 'safe_attributes' 

http://goo.gl/OO2H7

+0

¿Qué sucede si el objeto ya está creado? Recibo un error en mi objeto cuando intento acceder a 'myobj.association'.El objeto fue creado antes de agregar la gema a mi gemfile. Gracias. – daveomcd

Cuestiones relacionadas