37 votos

Actualizar una columna al valor de otro en la migración de rieles

Tengo una tabla en una aplicación Rails con cientos de miles de registros, y sólo tienen un created_at timestamp. Estoy añadiendo la capacidad de modificar los registros, así que quiero añadir un updated_at timestamp a la mesa. En mi migración para añadir la columna, quiero actualizar todas las filas tengan el nuevo updated_at coincide con la edad created_at, ya que es el predeterminado para las filas recién creadas en los Rieles. Yo podría hacer una find(:all) e iterar a través de los registros, pero que tomaría horas debido al tamaño de la tabla. Lo que realmente quiero hacer es:

UPDATE table_name SET updated_at = created_at;

Hay una mejor manera de hacerlo que en un Rieles de la migración con ActiveRecord en lugar de la ejecución de raw SQL?

52voto

nathanvda Puntos 25878

Crear una migración

rails g migration set_updated_at_values

y dentro de ella escribir algo como:

class SetUpdatedAt < ActiveRecord::Migration
  def self.up
    Yourmodel.connection.execute("update your_models set updated_at=created_at")
  end

  def self.down
  end
end

De esta forma consigues dos cosas

  • Este es un proceso repetible, con cada posible desplegar (donde sea necesario) se ejecuta
  • Esto es eficiente. No puedo pensar en una solución de rubyesque más (que es lo más eficiente).

Espero que esto ayude.

18voto

Greg Dan Puntos 2667

Puede utilizar update_all que funciona de forma muy similar a SQL crudo. Es que tienes todas las opciones.

Por cierto personalmente no pagar tanta atención a las migraciones. A veces cruda SQL es realmente la mejor solución. Generalmente no es reutilizar código de migraciones. Se trata de una acción de tiempo se moleste sobre pureza del código.

-1voto

ghoppe Puntos 10004

Como una operación del tiempo, sólo lo haría el rails console . ¿Tendrá realmente horas? Tal vez si hay millones de registros...

records = ModelName.all; records do |r|; r.update_attributes(:updated_at => r.created_at); r.save!; end;

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X