validar rails formularios formulario ruby-on-rails ruby activerecord timestamp

ruby-on-rails - validar - formularios en ruby on rails



¿Hay alguna manera de evitar actualizar automáticamente los campos de marca de tiempo de Rails? (10)

Como esta es una importación única, puede hacer lo siguiente:

  1. Crea un modelo usando los campos legacy_created_at y legacy_updated_at .
  2. Cargar datos heredados. Haga un mapa en los campos modelo como desee. Puede usar #save y generalmente no se preocupe por usar update_all o similar, y puede usar callbacks si lo desea.
  3. Cree una migración para cambiar el nombre de las columnas a created_at y updated_at .

Si tiene columnas de DB created_at y updated_at Rails establecerá automáticamente esos valores cuando cree y actualice un objeto de modelo. ¿Hay alguna manera de guardar el modelo sin tocar esas columnas?

Traigo algunos datos legados y me gustaría establecer esos valores a partir de los valores correspondientes en los campos de datos legados (con nombres diferentes). Estoy descubriendo que cuando los configuro en el modelo y luego guardo el modelo, Rails parece anular los valores entrantes.

Por supuesto, podría simplemente nombrar las columnas del modelo Rails de manera diferente para evitar eso, pero después de que se importen los datos, quiero que Rails haga lo mismo con la marca de tiempo automática.


Cuando no está en una importación masiva, ¿puede anular las marcas de registro de hora de debería? método en su modelo para agregar nuevas comprobaciones sobre cuándo actualizar la columna updated_at.


En Rails 3+, para un solo objeto, establezca record_timestamps para el objeto en lugar de la clase. Es decir,

>> user = User.first >> user.updated_at => Tue, 12 Apr 2016 22:47:51 GMT +00:00 >> user.name = "Jose" => "Jose" >> user.record_timestamps = false >> user.save => true >> user.updated_at => Tue, 12 Apr 2016 22:47:51 GMT +00:00 >> User.record_timestamps => true

De esta forma, no toca el estado global para el modelo, y no tiene que recordar restaurar la configuración anterior en un bloque de ensure .


En referencia a otras respuestas, me sorprendió que las marcas de tiempo de desactivación para un solo modelo, como en:

User.record_timestamps = false

funcionó para mi base de datos de desarrollo, pero no en mi base de datos de preproducción, que se ejecuta en un servidor diferente. Sin embargo, funciona si deshabilito las marcas de tiempo para todos los modelos con

ActiveRecord::Base.record_timestamps = false

(Situación: modificar el atributo created_at en una migración)


Haz esto en una migración o en una tarea de rake (o en las nuevas semillas de la base de datos si estás en edge rail):

ActiveRecord::Base.record_timestamps = false begin run_the_code_that_imports_the_data ensure ActiveRecord::Base.record_timestamps = true # don''t forget to enable it again! end

Puede establecer de manera segura created_at y updated_at manual, Rails no se quejará.

Nota: Esto también funciona en modelos individuales, por ejemplo User.record_timestamps = false


Me gusta usar un módulo Mixin para desactivar temporalmente el sellado de tiempo en un bloque:

module WithoutTimestamps def without_timestamps old = ActiveRecord::Base.record_timestamps ActiveRecord::Base.record_timestamps = false begin yield ensure ActiveRecord::Base.record_timestamps = old end end end

Entonces puedes usarlo donde lo necesites

class MyModel < ActiveRecord::Base include WithoutTimestamps def save_without_timestamps without_timestamps do save! end end end

O solo una única vez como esta:

m = MyModel.find(1) WithoutTimestamps.without_timestamps do m.save! end



Puede configurar lo siguiente dentro de su migración:

ActiveRecord::Base.record_timestamps = false

O utiliza de forma constante update_all:

update_all (updates, conditions = nil, options = {})

Actualiza todos los registros con detalles proporcionados si coinciden con un conjunto de condiciones suministradas, también se pueden suministrar límites y el orden. Este método construye una sola instrucción SQL UPDATE y la envía directamente a la base de datos. No crea instancias de los modelos involucrados y no desencadena devoluciones de llamadas de Active Record.


Rails 5 proporciona una manera conveniente de actualizar un registro sin actualizar su marca de tiempo updated_at .

Usted, solo necesita pasar el touch:false mientras actualiza su registro.

>> user = User.first >> user.updated_at => Thu, 28 Apr 2016 20:01:57 IST +05:30 >> user.name = "Jose" >> user.save(touch: false) => true >> user.updated_at => Thu, 28 Apr 2016 20:01:57 IST +05:30


use el método update_column en su lugar:

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_column

update_column(name, value) # Updates a single attribute of an object, without calling save.

La validación se omite.

Las rellamadas se omiten.

La columna updated_at / updated_on no se actualiza si esa columna está disponible.

Levanta un ActiveRecordError cuando se invoca a nuevos objetos, o cuando el atributo de nombre está marcado como de solo lectura.