当我创建一个模型时,我做了一个列edited:timestamp。
t.timestamp :edited # in migration file
期望每当用户编辑此模型中的任何内容时,都会更新时间/日期。
但我刚刚看到在数据库模式中它被写成
t.datetime "edited"
它希望用户在表单中输入数据。
这里发生了什么事?
我应该如何更改我的迁移文件以在 SQL DB 中创建时间戳列?或者我应该在模型本身中分配它?
我不希望它依赖于用户输入,必须是系统单元
谢谢。
当我创建一个模型时,我做了一个列edited:timestamp。
t.timestamp :edited # in migration file
期望每当用户编辑此模型中的任何内容时,都会更新时间/日期。
但我刚刚看到在数据库模式中它被写成
t.datetime "edited"
它希望用户在表单中输入数据。
这里发生了什么事?
我应该如何更改我的迁移文件以在 SQL DB 中创建时间戳列?或者我应该在模型本身中分配它?
我不希望它依赖于用户输入,必须是系统单元
谢谢。
创建模型时,您应该生成一个 ActiveRecord 迁移以创建将存储与此模型关联的数据的表。例如,如果您的模型名为“Product”,请运行:
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 的内置时间戳。
Rails,更具体地说,ActiveRecord 与数据库无关。这在寻求迁移应用程序或使用不同的数据库、堆栈等部署应用程序时非常有用。但是它施加的限制之一是 AR 不支持任何特定于数据库的功能。
可以在此处找到 AR 列类型的列表。如您所见,“timestamp”是一种 AR 列类型,但它更像是“datetime”类型的别名。
因此,如果您想在应用程序中使用真正的 SQL 时间戳列,您可以执行以下两项操作之一:
您可以编辑迁移文件并尝试 `t.edited "TIMESTAMP"'(未经测试但应该可以工作,因为 AR 允许将自定义类型作为字符串)
您可以在数据库中创建列并允许 AR 提取它。
如果您是 Rails 新手,那么我强烈建议您使用 Gullaume Galuz 的答案,让 AR 处理created_at和updated_at列。
如果没有,您还可以看一下这个问题,将清楚地阐明需要使用 DB 特定TIMESTAMP列。(大小、速度、区域等)