Rails将默认DateTime设置为

时间:2015-06-23 03:29:05

标签: ruby-on-rails

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

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
edn

当我运行rake db:migrate时出现错误。我的语法错了还是我错过了其他的东西?

5 个答案:

答案 0 :(得分:8)

是的,您错过了类型

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将根据您运行迁移的时间进行评估,而不是在创建记录时进行评估。您需要查看此answer以了解如何设置默认时间。

答案 1 :(得分:3)

如果您希望postgres在插入时设置默认时间,则需要

`default: "now()"` 

我们发现实现这一目标的唯一方法是在现有的日期时间列上执行迁移,如下所示:

#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

答案 2 :(得分:2)

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

要解决此问题,您需要创建一个ActiveRecord回调,以便设置wk1_time,如下所示:

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

答案 3 :(得分:1)

for Postgresql:

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

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

答案 4 :(得分:0)

Since Rails 5,您可以像这样进行迁移:

change_column_default :users, :wk1_time, -> { 'CURRENT_TIMESTAMP' }

在我看来,这是最好的选择,因为它不是特定于数据库的答案。