2010-12-22 22 views
59

Agregué una nueva columna a mi tabla pero olvidé agregar la opción: predeterminada. Ahora quiero llenar esa columna en cada fila.Actualizar una columna, todas las filas

¿Hay alguna manera de hacerlo con la consola? He estado buscando en google durante la última hora pero no puedo encontrar nada.

Sé cómo hacerlo para un solo objeto, pero no para todos en un modelo. Foo.find (1) .update_attribute (: MyAttribute, 'valor')

+0

¿Desea asignar el mismo valor para cada fila o diferente para cada una? –

+0

El mismo valor para todos. Gracias –

+0

bien, @petrov. Puedes probar el método update_all –

Respuesta

116

Prueba esto:

Foo.update_all(some_column: "bar") 

Esto generará consulta SQL a la base de datos:

UPDATE "foos" SET "some_column" = "bar"; 
+0

Gracias pake007. Esto funciona. Inicialmente probé ModelName.update pero no funcionó –

+4

No hay problema @Petrov, y aún más, puede pasar un parámetro de condición a este método. como: Foo.update_all ({: new_column => "bar"}, {: old_column_1 => nil}). Actualizará todos los registros que tengan un valor nulo en la columna 'old_column_1'. –

+0

Pero para rieles 2.2? que uso de sintaxis? – harsh4u

22

Dado que ya ha creado el nuevo campo en una migración anterior, cree una nueva migración:

rails g migration UpdateFoos 

Modi fy la migración:

def self.up  
    say_with_time "Updating foos..." do 
    Foo.find(:all).each do |f| 
     f.update_attribute :myattribute, 'value' 
    end 
    end 
end 

# from command line 
Rake db:migrate 

Avísame si esto funciona, puede ser que necesite algunos ajustes. Ver rieles docs para más:

+0

¡Este sería el buen enfoque! – Zabba

+4

Gran respuesta. Rails3 personas, use Foo.all en lugar de Foo.find (: all) en el ejemplo anterior. – Phantomwhale

+1

Esto es bueno para el alojamiento de aplicaciones en heroku :) – matma

3

se puede hacer así:

Foo.update_all (new_column: "barra")

2

Por supuesto se puede utilizar como Smth Foo.update_all(:myattribute => "value"), pero es Solo modificaré los datos ya creados. Para establecer el valor por defecto para todos los datos "futuros" que es una buena manera de crear una migración separada de esta manera:

rails generate migration AddDefaultValueToFoo 

Modificar nueva migración (por ej MyAttribute tiene un tipo de cadena.) De esta manera:

class AddDefaultValueToFoo < ActiveRecord::Migration 
    def self.up 
    change_column :foos, :myattribute, :string, :default => "value" 
    Foo.update_all(:myattribute => "value") 
    end 
end 
Cuestiones relacionadas