迁移“列”:时间戳无效

时间:2012-12-02 03:23:02

标签: ruby-on-rails

当我创建模型时,我编辑了一个列:timestamp。

t.timestamp :edited # in migration file

期待用户在此模型中编辑任何内容时,时间/日期将会更新。

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

t.datetime "edited"

并且它希望用户以表格形式输入数据。

这里发生了什么?

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

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

THX。

2 个答案:

答案 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_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的内置时间戳。

答案 1 :(得分:1)

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

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

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

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

  2. 您可以在数据库中创建列,并允许AR选择它。

  3. 如果您不熟悉rails,那么我强烈建议您使用Gullaume Galuz的答案,让AR处理created_atupdated_at列。

    如果没有,您还可以查看this question,这将清楚地说明是否需要使用特定于数据库的TIMESTAMP列。 (大小,速度,区域等)