2012-12-02 185 views
0

当我创建模型时,我编辑了一列:时间戳。迁移“列”:时间戳不起作用

t.timestamp :edited # in migration file 

预计,无论何时用户在此模型中编辑任何内容,时间/日期都会更新。

但我只是看到,在数据库架构它写下来作为

t.datetime "edited" 

,并预计用户在表单中输入的数据。

这里发生了什么?

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

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

THX。

回答

6

当您创建模型时,您应该生成一个ActiveRecord迁移来创建将存储与此模型关联的数据的表。例如,如果你的模型被称为“产品”,运行:

rails g migration create_products_table 

,这将产生一个数据库迁移文件/迁移(前缀为您生成迁移文件的时间戳,如:“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的内置时间戳。

+0

这么容易..谢谢。我只是一个新手 - 不知道Rails可以为我创建它们 – user1837021

1

Rails,更具体地说,ActiveRecord是数据库不可知的。当考虑迁移应用程序或使用不同的数据库,堆栈等来部署应用程序时,这非常棒。但是,它强加的一个限制是AR不支持任何特定于数据库的功能。

AR列类型列表可以找到here。正如你所看到的,“timestamp”是一个AR列类型,但它更像是“datetime”类型的别名。

所以,如果你想在你的应用程序中使用SQL真正timestamp列,你可以做两件事情之一:

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

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

如果你是新的轨道,那么我会强烈建议使用Gullaume Galuz的回答,让AR采取created_atupdated_at列的照顾。

如果不是,你也可以看看this question会清楚地说明需要使用DB专用的TIMESTAMP列。 (大小,速度,区域等)