Рассмотрим сценарий создания таблицы ниже:
create_table :foo do |t|
t.datetime :starts_at, :null => false
end
Можно ли установить значение по умолчанию как текущее время?
Я пытаюсь найти независимый от БД эквивалент в рельсах для определений столбцов SQL, приведенных ниже:
Синтаксис Oracle
start_at DATE DEFAULT SYSDATE()
Синтаксис MySQL
start_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ИЛИ
start_at DATETIME DEFAULT NOW()
ruby-on-rails
Хариш Шетти
источник
источник
CURRENT_TIMESTAMP
будет время начала текущей транзакции, поэтому несколько записей, созданных в одной транзакции, получат одно и то же значение. Если вам нужно фактическое текущее время выполнения инструкции (игнорируя контекст транзакции), проверьтеCLOCK_TIMESTAMP
.add_column :table_name, :start_date, :datetime, default: -> { 'CURRENT_TIMESTAMP' }
и вот как это выглядит в schema.rb.t.datetime "start_date", default: -> { "now()" }
Но когда я создал новую запись, она не заполнялась . Есть идеи, почему?post.reload
чтобы получить эти значения. Это объясняется здесь: stackoverflow.com/questions/53804787/…Вы можете добавить функцию в такую модель:
Чтобы модель установила текущее время в модели.
Вы также можете поместить в миграцию некоторый sql-код для установки значения по умолчанию на уровне базы данных, например:
Настройка примерно так:
вызывает выполнение функции Time.now во время миграции, поэтому таблица в базе данных создается следующим образом:
но я думаю, что это не то, что вам нужно.
источник
new()
). Такself.foo = Time.now
будет отменено значение, которое вы могли бы датьnew()
. Я предлагаюself.foo = Time.current unless self.foo.present?
вместо этого.:starts_at, :default => 'now()'
в schema.rb. Однако это не сработает при использовании,rake db:schema:dump
который переопределит schema.rb с помощью:starts_at, :default => '2015-05-29 09:46:33'
(или любой другой даты, когда вы запускаете скрипт) ... грустно ....Вам не нужно ничего делать, кроме этого столбца.
источник
Я обычно делаю:
Итак, у вас
schema.rb
будет что-то вроде:источник
rake db:migrate
, а не при загрузке файла схемы с чем-то вродеrake db:schema:load
.Я искал похожие решения, но закончил использовать https://github.com/FooBarWidget/default_value_for .
default_value_for
Плагин позволяет определить значения по умолчанию для моделей ActiveRecord в заявительном порядке. Например:источник
Если вам нужно изменить в существующий столбец DateTime в Rails 5 (вместо создания новой таблицы , как указано в других ответах) , так что он может воспользоваться возможностью даты по умолчанию, вы можете создать миграцию , как это:
источник
В ответе @ szymon-lipiński (Szymon Lipiński) метод выполнения у меня не сработал. Выдавала синтаксическую ошибку MySQL.
Синтаксис MySQL, который у меня сработал, таков.
Таким образом, установить значение по умолчанию для столбца datetime в скрипте миграции можно следующим образом:
источник