ruby-on-rails Rails将默认DateTime设置为now

dxpyg8gm  于 2023-07-01  发布在  Ruby
关注(0)|答案(6)|浏览(120)

在我的应用程序中,我有团队,每个团队每周都有比赛时间。我希望游戏时间设置为“现在”作为默认值。我的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时,我得到一个错误。是我的语法错误还是我遗漏了什么?

qv7cva1a

qv7cva1a1#

在迁移过程中,您将遇到设置默认日期和时间的问题。这是因为DateTime.now将根据迁移运行的时间进行评估,而不是记录创建的时间!
为了解决这个问题,你需要创建一个ActiveRecord回调函数来设置wk1_time,如下所示:

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

8cdiaqws2#

对于PostgreSQL:

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

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

jtw3ybtb

jtw3ybtb3#

这对我很有效:

class MigrationName < ActiveRecord::Migration[7.0]
  def change
    add_column :table_name, :column_name, :integer, default: 100, null: false
    add_column :table_name, :column_name_date_to_save, :datetime, default: DateTime.now
  end
end
vddsk6oq

vddsk6oq4#

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

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

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

7nbnzgx9

7nbnzgx95#

是,您缺少类型

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以了解如何设置默认时间。

z31licg0

z31licg06#

编辑:对于Rails 5+,有更好的答案,比如这个:https://stackoverflow.com/a/55357711/252799,尽管下面的仍然有效。

我发现的方法是在现有的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

"now()"是一个发送到postgresql的字符串,并在每次插入时在运行时进行评估。

相关问题