Considere o script de criação de tabela abaixo:
create_table :foo do |t|
t.datetime :starts_at, :null => false
end
É possível definir o valor padrão como a hora atual?
Estou tentando encontrar um equivalente independente de banco de dados em trilhos para as definições de coluna SQL fornecidas abaixo:
Sintaxe Oracle
start_at DATE DEFAULT SYSDATE()
Sintaxe MySQL
start_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
OU
start_at DATETIME DEFAULT NOW()
ruby-on-rails
Harish Shetty
fonte
fonte
CURRENT_TIMESTAMP
será a hora do início da transação atual, então vários registros criados na mesma transação obterão o mesmo valor. Se você deseja a hora atual real em que a instrução é executada (ignorando o contexto da transação), faça check-outCLOCK_TIMESTAMP
.add_column :table_name, :start_date, :datetime, default: -> { 'CURRENT_TIMESTAMP' }
e é assim que parece no schema.rbt.datetime "start_date", default: -> { "now()" }
Mas quando eu criei um novo registro, ele não estava sendo preenchido. Alguma ideia do porquê?post.reload
para obter esses valores. É explicado aqui: stackoverflow.com/questions/53804787/…Você pode adicionar uma função em um modelo como este:
Para que o modelo defina a hora atual no modelo.
Você também pode colocar algum código sql na migração para definir o valor padrão no nível do banco de dados, algo como:
Definindo algo assim:
faz com que a função Time.now seja executada durante a migração, então a tabela no banco de dados é criada assim:
mas acho que não é o que você quer.
fonte
new()
). Portantoself.foo = Time.now
, substituirá o valor que você pode atribuirnew()
. Eu sugiro emself.foo = Time.current unless self.foo.present?
vez disso.:starts_at, :default => 'now()'
no schema.rb. No entanto, isso não funcionará ao usar orake db:schema:dump
que substituirá o schema.rb com:starts_at, :default => '2015-05-29 09:46:33'
(ou qualquer que seja a data de quando você iniciar o script) ... triste ....Você não precisa fazer mais nada, exceto ter essa coluna.
fonte
Eu estava procurando uma solução semelhante, mas acabei usando https://github.com/FooBarWidget/default_value_for .
O
default_value_for
plugin permite definir valores padrão para modelos ActiveRecord de forma declarativa. Por exemplo:fonte
Eu costumo fazer:
Então, você
schema.rb
terá algo como:fonte
rake db:migrate
, não quando carrega seu arquivo de esquema com algo semelhanterake db:schema:load
.Se você precisar alterar uma coluna DateTime existente no Rails 5 (ao invés de criar uma nova tabela conforme especificado em outras respostas) para que ela possa tirar proveito do recurso de data padrão, você pode criar uma migração como esta:
fonte
Na resposta dada por @ szymon-lipiński (Szymon Lipiński), o método de execução não funcionou para mim. Estava gerando um erro de sintaxe do MySQL.
A sintaxe do MySQL que funcionou para mim é esta.
Portanto, definir o valor padrão para uma coluna datetime no script de migração pode ser feito da seguinte maneira:
fonte