在我的应用程序中,我有团队,每个团队每周都有比赛时间。我希望游戏时间设置为“现在”作为默认值。我的table是这样布置的
create_table "teams", force: true do |t|
t.datetime "wk1_time"
end
我创建了一个迁移,它看起来像这样:
class ChangeDateTimeDefault < ActiveRecord::Migration
def change
change_column :teams, :wk1_time, :default => DateTime.now
end
end
当我运行rake db:migrate时,我得到一个错误。是我的语法错误还是我遗漏了什么?
6条答案
按热度按时间qv7cva1a1#
在迁移过程中,您将遇到设置默认日期和时间的问题。这是因为
DateTime.now
将根据迁移运行的时间进行评估,而不是记录创建的时间!为了解决这个问题,你需要创建一个ActiveRecord回调函数来设置
wk1_time
,如下所示:8cdiaqws2#
对于PostgreSQL:
但是你必须在
user = User.create
之后使用user.reload
才能“看到”msgs_seen_atjtw3ybtb3#
这对我很有效:
vddsk6oq4#
Since Rails 5您可以这样进行迁移:
在我看来,这是最好的选择,因为它不是数据库特定的答案。
7nbnzgx95#
是,您缺少类型:
但是,你需要下面的而不是上面的,因为你只是想改变 * 默认值 *。
但这些都不是正确的方法为您的任务。原因是
DateTime.now
将根据您运行迁移的时间而不是创建记录的时间进行评估。您需要查看此answer以了解如何设置默认时间。z31licg06#
编辑:对于Rails 5+,有更好的答案,比如这个:https://stackoverflow.com/a/55357711/252799,尽管下面的仍然有效。
我发现的方法是在现有的datetime列上进行迁移 *,如下所示:
生成如下所示的schema.rb条目:
"now()"
是一个发送到postgresql的字符串,并在每次插入时在运行时进行评估。