Ruby on rails Rails将默认日期时间设置为现在
在我的应用程序中,我有团队,每个团队每周都有一次比赛时间。我希望游戏时间设置为“现在”作为默认值。我的桌子是这样摆好的Ruby on rails Rails将默认日期时间设置为现在,ruby-on-rails,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_tim
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
#migration
execute("ALTER TABLE teams ALTER COLUMN wk1_time SET DEFAULT CURRENT_TIMESTAMP")
#schema.rb
t.datetime "wk1_time", default: "now()", null: false
class ChangeDateTimeDefaultDateTime.now
结束
埃德恩
当我运行rakedb:migrate时,我得到一个错误。我的语法错了还是遗漏了其他内容?是的,您遗漏了类型:
class ChangeDateTimeDefault < ActiveRecord::Migration
def change
change_column :teams, :wk1_time, :datetime, :default => DateTime.now
end
end
class ChangeDateTimeDefaultdatetime.now
结束
结束
但是,您需要下面的而不是上面的,因为您只想更改默认值
class ChangeDateTimeDefault
但这些都不是完成任务的正确方法。原因是
DateTime。现在将根据运行迁移的时间而不是创建记录的时间来计算。您需要了解这一点,以了解如何设置默认时间。您将在迁移中遇到设置默认日期时间的问题。这是因为DateTime.now
将根据迁移运行的时间而不是记录创建的时间进行计算
要解决此问题,您需要创建一个ActiveRecord回调来设置wk1\u时间
,如下所示:
before_create :set_default_wk1_datetime
def set_default_wk1_datetime
self.wk1_time = DateTime.now
end
编辑:对于Rails 5+来说,有更好的答案,比如这个:,尽管下面的方法仍然有效
我发现的方法是对现有的datetime列进行迁移,如下所示:
class ChangeDateTimeDefault < ActiveRecord::Migration
def change
change_column :teams, :wk1_time, :default => DateTime.now
end
edn
#migration
execute("ALTER TABLE teams ALTER COLUMN wk1_time SET DEFAULT CURRENT_TIMESTAMP")
#schema.rb
t.datetime "wk1_time", default: "now()", null: false
这将生成一个schema.rb条目,如下所示:
class ChangeDateTimeDefault < ActiveRecord::Migration
def change
change_column :teams, :wk1_time, :default => DateTime.now
end
edn
#migration
execute("ALTER TABLE teams ALTER COLUMN wk1_time SET DEFAULT CURRENT_TIMESTAMP")
#schema.rb
t.datetime "wk1_time", default: "now()", null: false
“now()”
是发送到postgresql并在每次插入时在运行时进行计算的字符串。对于postgresql:
add_column :users, :msgs_seen_at, 'TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP'
但您必须使用user.reload
在user=user.create
之后重新加载,以便在处“查看”msgs,您可以进行如下迁移:
class ChangeDateTimeDefault < ActiveRecord::Migration
def change
change_column :teams, :wk1_time, :default => DateTime.now
end
edn
#migration
execute("ALTER TABLE teams ALTER COLUMN wk1_time SET DEFAULT CURRENT_TIMESTAMP")
#schema.rb
t.datetime "wk1_time", default: "now()", null: false
change\u column\u默认值:users,:wk1\u time,->{'CURRENT\u TIMESTAMP'}
在我看来,这是最好的选择,因为它不是特定于数据库的答案。错误是什么。。粘贴在这里please@ArupRakshit未定义的方法“to_sym”我给了你解释。。请退房……)如果你投反对票,请告诉我为什么,这是一个教育论坛。我会尊重你的,我知道我并不总是对的。这里介绍的解决方案对我们有效,只要我认为它对其他人有帮助,我就不会使用它。FWIW,至少在Rails 6上,这不起作用,因为它不在lambda中。要实现这一点,需要:default:->{“now()”}
@kroehre“now()”
是在PG中计算的,而不是在Ruby中。答案仍然有效,因为它不依赖于任何Rails版本,尽管在Rails5中,这可以在Ruby方面完成:如果Rails6中没有lambda,这对我来说是不起作用的。该列结束时没有任何默认值,并引发了一个错误,抱怨空值。添加lambda修复了这个问题。将lambda添加到执行
没有意义。。。您可能误解了架构结果并将其放入了迁移中。这也是Rails 6的正确答案。当您运行此迁移时,Rails将其序列化为schema.rb中的now()“
。看起来他们是对等的。