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