我正在编写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_on
和created_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
是一种琐碎的方式,考虑到这只会影响一次迁移。 ;)
答案 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
命令,它就会更容易阅读。