所有的坑都来自于 无知 ,这次也不例外,我又掉坑里了...
先来看段代码:
def change
add_column :servers, :vip_date, :date, :default => Date.today
end
这是一个很常见的迁移任务,新增一栏,设置默认值。执行迁移也毫无警告,看起来一切都那么美好。而真相其实是这样的:
假设今天是 9 月 9 日:
Server.new.vip_date #=> Sun, 09 Sep 2013
嗯,看起来很完美。可过了一天你再试试?
Server.new.vip_date #=> Sun, 09 Sep 2013
见鬼,怎么还是相同的日期?难道Date.today
秀逗了?
表象可能有很多种,而真相只有一个:
Active Record Migrations 并不支持 动态默认值,你应该在回调中处理,比如after_initialize
.
:default => Date.today
不就是
:default => "你当天运行的日期"
吗?
你要数据库层做动态默认值,得用数据自带的函数,而每种数据的函数也是不一样的
migration 这样处理没有问题,如果你要做