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

Jos*_*ver 6 ruby-on-rails

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

create_table(TABLE, :options => FEDERATED_TABLE_CONFIG % TABLE) do |table|
  table.timestamps
  table.string :country_tld
end
Run Code Online (Sandbox Code Playgroud)

这导致下表:

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'
Run Code Online (Sandbox Code Playgroud)

可悲的是,我的外国数据源使用旧式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
Run Code Online (Sandbox Code Playgroud)

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

idl*_*ers 8

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

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

table.datetime :created_on, :updated_on
Run Code Online (Sandbox Code Playgroud)


jon*_*nii 5

导轨源timestamps是:

def add_timestamps(table_name)
  add_column table_name, :created_at, :datetime
  add_column table_name, :updated_at, :datetime
end
Run Code Online (Sandbox Code Playgroud)

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

%w{created_on updated_on}.each {|col| table.datetime col.to_sym }
Run Code Online (Sandbox Code Playgroud)

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