我可以将Rails 4.2中的时间戳列名从created_at修改为like

时间:2016-05-18 12:01:27

标签: ruby-on-rails-4

我想更改timestamps默认列名 created_atcreatedDatetimeupdated_atupdatedDatetime

有没有办法这样做?当我迁移它时,我可以按照自己的意愿创建这些名称吗?

2 个答案:

答案 0 :(得分:3)

最快,最灵活的解决方案不涉及猴子修补:

class Product < ActiveRecord::Base
  before_create :set_time_stamps
  before_save :set_time_stamps

private
  def set_time_stamps
    self.createdDatetime = DateTime.now if self.new_record?
    self.updatedDatetime = DateTime.now
  end
end

您可以在每个更新列名称的模型类(数据库表)中完全控制。如果您选择的话,您可以控制格式,以防该字段是时间戳,毫秒时间,甚至是格式化字符串(它会发生!)。此解决方案极有可能在Rails的主要版本升级后继续存在,因为这是ActiveRecord公共接口的一部分。

如果您有许多行为相同的模型,您可以创建一个基类或模块来处理它。

基类方法:

class TimeStamper < ActiveRecord::Base
  # TimeStamper is not intended for single-table inheritance
  self.abstract_class = true

  before_create :set_time_stamps
  before_save :set_time_stamps

private
  def set_time_stamps
    self.createdDatetime = DateTime.now if self.new_record?
    self.updatedDatetime = DateTime.now
  end
end

然后从中推导出你的模型,如下:

class Product < TimeStamper
  # inherits all of the ActiveRecord::Base and TimeStamper functionality
end

在迁移过程中,您只需要像其他人一样包含字段:

class CreateProducts < ActiveRecord::Migration
  def change
    create_table :products do |t|
      # Product fields

      t.datetime :createdDatetime, null: false
      t.datetime :updatedDatetime, null: false
    end
  end
end

您必须手动添加这些内容,但如果您需要执行此操作,那么这不是一项繁重的任务。 Rails可以根据您的要求灵活地偏离惯例,在这种情况下,偏差既方便又易于手动处理。

答案 1 :(得分:0)

可以手动设置字段名称:

http://api.rubyonrails.org/classes/ActiveRecord/Timestamp.html#method-i-timestamp_attributes_for_create

def timestamp_attributes_for_create
    [:createdDatetime]
end

我的回答是重复https://stackoverflow.com/a/13457972/1007043此外,还有关于Rails 5解决方案的信息