2009-11-18 17 views
12

Tengo un script usando ActiveRecord que crea nombres de columna dinámicamente en base a los valores leídos desde un archivo CSV, algo como esto:nombres de columna Actualizar en la clase del modelo ActiveRecord

FasterCSV.foreach('votes.csv', :headers => true) do |row| 
    column_name = "roll_call_id_#{row['roll_call_id']}" 

    if !Legislator.columns.map(&:name).include?(column_name) 
    connection_pool.connection.add_column('legislators', column_name, 'string') 
    end 
end 

El problema es que, después de crear el nuevo columna, no puedo hacer un legislator.update_attribute(column_name, value) porque la clase no recoge la nueva columna y se queja de que no existe.

¿Cómo puedo hacer que vuelva a consultar la estructura de la tabla?

Respuesta

29

Legislator.reset_column_information (API info)

+1

¿Existe una forma sencilla de aplicar a cada modelo, por ejemplo: 'ActiveRecord :: Base. reset_column_information'? – Dorian

+3

Sí, 'ActiveRecord :: Base.descendants.each (&: reset_column_information)' – Joao

0

como obvio171 señaló, es bastante fácil:

Es necesario crear una clase del modelo desnuda por adelantado.

Luego, en la migración necesita llamar MyModel.reset_column_information, de modo que la información de la columna se vuelve a cargar de manera que es con la nueva tabla que acaba de crear (o modificado)

A continuación, puede utilizar simplemente todos los métodos para crear nuevos registros

que usar algo como:

data = [[1,'foo'], [2,'bar'],[3,'zip']].map{|a,b| {id:a, txt:b} } 
MyModel.create!(data) 

Pero si los datos de la semilla es más que unas pocas constantes, entonces debería probablemente no Burry sus datos en una migración de esta manera.

Cuestiones relacionadas