我想更改timestamps
默认列名
created_at
到createdDatetime
和updated_at
到updatedDatetime
。
有没有办法这样做?当我迁移它时,我可以按照自己的意愿创建这些名称吗?
答案 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)
可以手动设置字段名称:
def timestamp_attributes_for_create
[:createdDatetime]
end
我的回答是重复https://stackoverflow.com/a/13457972/1007043此外,还有关于Rails 5解决方案的信息