Rails将默认DateTime设置为now

在我的应用程序中,我有团队,每个团队每周都有一个游戏时间。 我希望将游戏时间设置为“现在”作为默认值。 我的桌子是这样设置的

create_table "teams", force: true do |t| t.datetime "wk1_time" end 

我创建了一个迁移,它看起来像这样:

 class ChangeDateTimeDefault  DateTime.now end edn 

当我运行rake db:migrate时出现错误。 我的语法错了还是我错过了别的什么?

是的,你错过了类型

 class ChangeDateTimeDefault < ActiveRecord::Migration def change change_column :teams, :wk1_time, :datetime, :default => DateTime.now end end 

但是,您需要以下而不是上面的那个,因为您只想更改默认值

 class ChangeDateTimeDefault < ActiveRecord::Migration def change change_column_default :teams, :wk1_time, DateTime.now end end 

但这些都不是你的任务的正确方法。 原因是DateTime.now将根据您运行迁移的时间进行评估,而不是在创建记录时进行评估。 您需要查看此答案以了解如何设置默认时间。

如果你想让postgres在插入上设置默认时间,你需要

 `default: "now()"` 

我们发现实现这一目标的唯一方法是在现有的datetime列上进行迁移,如下所示:

 #migration execute("ALTER TABLE teams ALTER COLUMN wk1_time SET DEFAULT CURRENT_TIMESTAMP") 

生成一个如下所示的schema.rb条目:

 #schema.rb t.datetime "wk1_time", default: "now()", null: false 

您将在迁移中遇到问题设置默认日期时间。 这是因为DateTime.now将根据迁移的运行时间进行评估,而不是在创建记录时进行评估!

要解决这个问题,你需要创建一个ActiveRecord回调,以便像这样设置wk1_time

 before_create :set_default_wk1_datetime def set_default_wk1_datetime self.wk1_time = DateTime.now end 

对于Postgresql:

 add_column :users, :msgs_seen_at, 'TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP' 

但是你必须在user = User.create之后使用user.reload才能“看到”msgs_seen_at