0

当我创建一个模型时,我做了一个列edited:timestamp。

t.timestamp :edited # in migration file

期望每当用户编辑此模型中的任何内容时,都会更新时间/日期。

但我刚刚看到在数据库模式中它被写成

t.datetime "edited"

它希望用户在表单中输入数据。

这里发生了什么事?

我应该如何更改我的迁移文件以在 SQL DB 中创建时间戳列?或者我应该在模型本身中分配它?

我不希望它依赖于用户输入,必须是系统单元

谢谢。

4

2 回答 2

6

创建模型时,您应该生成一个 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_atupdated_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 的内置时间戳。

于 2012-12-02T03:53:05.217 回答
1

Rails,更具体地说,ActiveRecord 与数据库无关。这在寻求迁移应用程序或使用不同的数据库、堆栈等部署应用程序时非常有用。但是它施加的限制之一是 AR 不支持任何特定于数据库的功能。

可以在此处找到 AR 列类型的列表。如您所见,“timestamp”是一种 AR 列类型,但它更像是“datetime”类型的别名。

因此,如果您想在应用程序中使用真正的 SQL 时间戳列,您可以执行以下两项操作之一:

  1. 您可以编辑迁移文件并尝试 `t.edited "TIMESTAMP"'(未经测试但应该可以工作,因为 AR 允许将自定义类型作为字符串)

  2. 您可以在数据库中创建列并允许 AR 提取它。

如果您是 Rails 新手,那么我强烈建议您使用 Gullaume Galuz 的答案,让 AR 处理created_atupdated_at列。

如果没有,您还可以看一下这个问题,将清楚地阐明需要使用 DB 特定TIMESTAMP列。(大小、速度、区域等)

于 2012-12-02T04:18:58.333 回答