Rails时间戳:updated_on / created_on与created_at / updated_at

时间:2011-03-17 12:46:05

标签: ruby-on-rails

我正在编写Rails迁移来创建表:

create_table(TABLE, :options => FEDERATED_TABLE_CONFIG % TABLE) do |table|
  table.timestamps
  table.string :country_tld
end

这导致下表:

CREATE TABLE `sites` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  `country_tld` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=FEDERATED DEFAULT CHARSET=utf8 CONNECTION='mysql://foo:bar@localhost/baz/sites'

可悲的是,我的外部数据源使用旧学校的Rails updated_oncreated_on列作为其时间戳。当然,我可以解决这个问题:

create_table(TABLE, :options => FEDERATED_TABLE_CONFIG % TABLE) do |table|
  table.datetime :created_on, :updated_on
  table.string :country_tld
end

如果仍然有一种琐碎的方式来使用时间戳并获得我想要的行为,我很乐意听到它。不,我不认为monkey-patching ActiveRecord::Timestamp是一种琐碎的方式,考虑到这只会影响一次迁移。 ;)

2 个答案:

答案 0 :(得分:8)

我不完全确定你的问题在这里? ActiveRecord::Timestamp将使用与created_on版本相同的updated_on_at列(参见第84行和第88行)。

顺便说一句,您无需循环遍历数组以在单行中生成日期时间。请改用:

table.datetime :created_on, :updated_on

答案 1 :(得分:5)

timestamps的导轨来源是:

def add_timestamps(table_name)
  add_column table_name, :created_at, :datetime
  add_column table_name, :updated_at, :datetime
end

所以你可以看到没有办法自定义列名。说实话,最好的方法是你建议的那个。我个人避免这样的事情:

%w{created_on updated_on}.each {|col| table.datetime col.to_sym }

只要写出实际的add_column命令,它就会更容易阅读。