2011-10-10 3 views
12

Tengo que conectarme a una base de datos existente utilizada por nuestro servidor freeradius. Una tabla tiene una columna llamada atributo a la que intento acceder.ActiveRecord :: DangerousAttributeError

Al acceder, me sale el error:

ActiveRecord::DangerousAttributeError 
attribute? is defined by ActiveRecord 

he tratado de seleccionar y cambiar el nombre de esta columna en mi modelo:

def self.default_scope 
    Radcheck.select("attribute as newattribute") 
end 

Pero eso no funciona bien.

¿Alguien puede recomendar una forma de evitar esto? ¡Realmente me gustaría cambiar el nombre de la columna en rieles!

Respuesta

2

que nunca se han encontrado con esta situación, pero creo que esto debería funcionar

class Radcheck < ActiveRecord::Base 
    default_scope :select=> 'attribute as newattribute' 
end 

que puedes usar método de instancia default_scope no una clase

También tiene la opción de usar método de instancia, como:

RadCheck.read_attribute :attribute 

creo que sirve

+0

Gracias - He intentado esto y todavía consigo el error chorreado .¿Debo modificar también la acción de mi controlador? Actualmente tengo esto: @radcheck = Radcheck.all Gracias –

+0

No funcionó en AR4 –

10

En una relación Si pregunta Milar He encontrado esta respuesta: https://stackoverflow.com/a/9106597/1266906

Sin tener que preocuparse por los atributos que están reservados por ActiveRecord en Rails 3.0 sólo tiene que añadir

gem 'safe_attributes' 

a su Gemfile y la gema tratará de hacerse cargo de todos los nombres que chocan automáticamente.

Al igual que con la otra respuesta que necesita utilizar Radcheck[:attribute] o Radcheck.read_attribute :attribute/Radcheck.write_attribute :attribute, 'value' acceder a los campos de nombre reservado internamente, pero la gema asegura validaciones como validates_presence_of :attribute funcionarán como de costumbre.

Más detalles están disponibles en https://github.com/bjones/safe_attributes

+1

Me encontré con el mismo problema con un atributo válido en mi base de datos heredada. Usar "atributos_seguros" funcionó de la caja. – dhenze

+2

Solo una nota para Googlers: esta gema funcionará para casi cualquier palabra reservada * excepto * para 'atributo'. Del archivo léame: "Es virtualmente imposible tener una columna llamada 'atributo' en su esquema cuando se usa ActiveRecord". –

+0

Si también usa Hirb, es posible que deba deshabilitar antes de intentar representar las columnas del modelo en la consola, con Hirb.disable. –

0

Aquí es una solución que requiere un cambio en la base de datos externa, pero es un cambio muy pequeño, y funcionará con cualquier nombre de la columna, incluso `attribute`. No se requiere gema

En su base de datos externa/heredada, cree una vista que cambie el nombre de la columna problemática. p.ej.

CREATE VIEW radcheck_view AS (
    SELECT id, username, op, value, attribute rad_attribute 
    FROM radcheck 
); 

Aquí el problema es la columna está cambiando el nombre a attributerad_attribute.

No olvide otorgar los permisos correspondientes en la vista. En mi caso es el uso de sólo lectura:

GRANT SHOW VIEW ON radius.radcheck_view TO <rails_user> IDENTIFIED BY '<password>'; 

Luego, en su modelo de rieles utilizar la vista como table_name

class RadiusRadcheck < RadiusExternal 
    self.table_name = 'radcheck_view' 
end