Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails将默认日期时间设置为现在_Ruby On Rails - Fatal编程技术网

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()“
。看起来他们是对等的。