首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >向现有表添加时间戳

向现有表添加时间戳
EN

Stack Overflow用户
提问于 2011-09-25 09:05:25
回答 18查看 102.2K关注 0票数 185

我需要将时间戳(created_at & updated_at)添加到现有表中。我尝试了下面的代码,但它不起作用。

代码语言:javascript
复制
class AddTimestampsToUser < ActiveRecord::Migration
    def change_table
        add_timestamps(:users)
    end
end
EN

回答 18

Stack Overflow用户

回答已采纳

发布于 2011-09-25 09:13:54

时间戳帮助器仅在create_table块中可用。您可以通过手动指定列类型来添加这些列:

代码语言:javascript
复制
class AddTimestampsToUser < ActiveRecord::Migration
  def change_table
    add_column :users, :created_at, :datetime, null: false
    add_column :users, :updated_at, :datetime, null: false
  end
end

虽然这与上面指定的add_timestamps方法没有相同的简洁语法,但Rails仍然会将这些列视为时间戳列,并正常更新值。

票数 232
EN

Stack Overflow用户

发布于 2011-09-25 09:14:46

迁移只是两个类方法(在3.1中是实例方法):updown (在3.1中有时是change实例方法)。您希望您的更改进入up方法:

代码语言:javascript
复制
class AddTimestampsToUser < ActiveRecord::Migration
  def self.up # Or `def up` in 3.1
    change_table :users do |t|
      t.timestamps
    end
  end
  def self.down # Or `def down` in 3.1
    remove_column :users, :created_at
    remove_column :users, :updated_at
  end
end

如果你在3.1版本中,你也可以使用change (谢谢戴夫):

代码语言:javascript
复制
class AddTimestampsToUser < ActiveRecord::Migration
  def change
    change_table(:users) { |t| t.timestamps }
  end
end

也许您混淆了def changedef change_tablechange_table

有关更多详细信息,请参阅migration guide

票数 95
EN

Stack Overflow用户

发布于 2017-04-22 01:29:27

@user1899434的回应是,这里的“现有”表可能意味着其中已经有记录的表,这些记录可能是您不想删除的记录。因此,当您添加带有null: false的时间戳时,这些现有记录都是无效的。

但我认为,通过将两个步骤结合到一个迁移中,以及使用更具语义的add_timestamps方法,可以改进这个答案:

代码语言:javascript
复制
def change
  add_timestamps :projects, default: Time.zone.now
  change_column_default :projects, :created_at, nil
  change_column_default :projects, :updated_at, nil
end

您可以用其他时间戳替换DateTime.now,例如,如果您希望在黎明时创建/更新预先存在的记录。

票数 80
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7542976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档