Considere el siguiente script de creación de tablas:
create_table :foo do |t|
t.datetime :starts_at, :null => false
end
¿Es posible establecer el valor predeterminado como la hora actual?
Estoy tratando de encontrar un equivalente independiente de DB en rieles para las definiciones de columna SQL que se dan a continuación:
Sintaxis de Oracle
start_at DATE DEFAULT SYSDATE()
Sintaxis de MySQL
start_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
O
start_at DATETIME DEFAULT NOW()
ruby-on-rails
Harish Shetty
fuente
fuente
CURRENT_TIMESTAMP
será el momento del inicio de la transacción actual, por lo que varios registros creados en la misma transacción obtendrán el mismo valor. Si desea la hora actual real en que se ejecuta la declaración (ignorando el contexto de la transacción), consulteCLOCK_TIMESTAMP
.add_column :table_name, :start_date, :datetime, default: -> { 'CURRENT_TIMESTAMP' }
Agregué algo como esto: y esto es lo que parece en el archivo schema.rbt.datetime "start_date", default: -> { "now()" }
Pero cuando creé un nuevo registro, no se completó . ¿Alguna idea de por qué?post.reload
para obtener esos valores. Se explica aquí: stackoverflow.com/questions/53804787/…Puede agregar una función en un modelo como este:
Para que el modelo establezca la hora actual en el modelo.
También puede colocar algún código SQL en la migración para establecer el valor predeterminado en el nivel de la base de datos, algo como:
Configurando algo como esto:
provoca la ejecución de la función Time.now durante la migración, por lo que la tabla en la base de datos se crea así:
pero creo que no es lo que quieres.
fuente
new()
). Porself.foo = Time.now
lo que anulará el valor que le pueda darnew()
. Sugiero en suself.foo = Time.current unless self.foo.present?
lugar.:starts_at, :default => 'now()'
en el archivo schema.rb. Sin embargo, esto no funcionará cuando se use,rake db:schema:dump
que anulará el schema.rb con:starts_at, :default => '2015-05-29 09:46:33'
(o cualquiera que sea la fecha en que inicie el script) ... triste ....No necesita hacer nada más que tener esa columna.
fuente
Estaba buscando soluciones similares pero terminé usando https://github.com/FooBarWidget/default_value_for .
El
default_value_for
complemento permite definir valores predeterminados para los modelos de ActiveRecord de manera declarativa. Por ejemplo:fuente
Yo suelo hacer:
Entonces, tu
schema.rb
vas a tener algo como:fuente
rake db:migrate
, no cuando carga su archivo de esquema con algo comorake db:schema:load
.Si necesita cambiar una columna DateTime existente en Rails 5 (en lugar de crear una nueva tabla como se especifica en otras respuestas) para que pueda aprovechar la capacidad de fecha predeterminada, puede crear una migración como esta:
fuente
En la respuesta dada por @ szymon-lipiński (Szymon Lipiński), el método de ejecución no funcionó para mí. Lanzaba un error de sintaxis de MySQL.
La sintaxis de MySQL que funcionó para mí es esta.
Entonces, para establecer el valor predeterminado para una columna de fecha y hora en el script de migración, se puede hacer de la siguiente manera:
fuente