【问题标题】:Rails timestamps: updated_on / created_on versus created_at / updated_atRails 时间戳:updated_on / created_on 与 created_at / updated_at
【发布时间】:2011-07-17 09:16:00
【问题描述】:

我正在编写 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 是一种微不足道的做法,因为这只会影响一次迁移。 ;)

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    我不完全确定您的问题是什么? ActiveRecord::Timestamp 将使用与 _at 版本相同的 created_onupdated_on 列(参见第 84 和 88 行)。

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

    table.datetime :created_on, :updated_on
    

    【讨论】:

    • 谢谢,我不知道您可以使用 "sexy syntax" 一次创建多个列。
    • 我的问题是:我可以使用#timestamps 助手来创建旧式列吗?
    【解决方案2】:

    timestamps 的 rails 来源是:

    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 命令,它更冗长也更容易阅读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 2015-09-16
      相关资源
      最近更新 更多