当我创建模型时,我编辑了一个列:timestamp。
t.timestamp :edited # in migration file
期待用户在此模型中编辑任何内容时,时间/日期将会更新。
但我刚刚在数据库模式中看到它被写为
t.datetime "edited"
并且它希望用户以表格形式输入数据。
这里发生了什么?
如何更改迁移文件以在SQL DB中创建时间戳列?或者我应该在模型中分配它?
我不希望它依赖于用户输入,必须是系统单元
THX。
答案 0 :(得分:6)
创建模型时,应生成ActiveRecord迁移以创建将存储与此模型关联的数据的表。例如,如果您的模型名为“产品”,请运行:
rails g migration create_products_table
这将在db / migrate中生成一个迁移文件(以生成迁移文件的时间戳为前缀,例如:“20121201200720_create_products_table.rb”)
迁移文件应如下所示:
class CreateProducts < ActiveRecord::Migration
def change
create_table :products do |t|
t.timestamps
end
end
end
当您运行此迁移(rake db:migrate
)时,ActiveRecord会自动在表格中创建两列:created_at
和updated_at
。然后去看看你的schema.rb(在db中)。会有类似的东西:
create_table "products", :force => true do |t|
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
created_at
将存储创建产品的时间戳。
updated_at
将存储产品上次更新的时间戳(您在此处寻找的内容)
因此,您不必创建自定义列,您应该只依赖ActiveRecord的内置时间戳。
答案 1 :(得分:1)
Rails,更具体地说,ActiveRecord被认为是数据库不可知的。在寻找迁移应用程序或使用不同的数据库,堆栈等部署应用程序时,这非常有用。但是它施加的限制之一是AR不支持任何特定于数据库的功能。
可以找到AR列类型列表here。如您所见,“timestamp”是AR列类型,但它更像是“datetime”类型的别名。
因此,如果要在应用程序中使用实际的SQL时间戳列,可以执行以下两项操作之一:
您可以编辑迁移文件并尝试`t.edited“TIMESTAMP”'(未经测试但应该可以使用,因为AR允许自定义类型作为字符串)
您可以在数据库中创建列,并允许AR选择它。
如果您不熟悉rails,那么我强烈建议您使用Gullaume Galuz的答案,让AR处理created_at
和updated_at
列。
如果没有,您还可以查看this question,这将清楚地说明是否需要使用特定于数据库的TIMESTAMP
列。 (大小,速度,区域等)