Rails迁移将当前日期设置为默认值

时间:2012-02-01 03:08:54

标签: ruby-on-rails migration

我在表格中有一个列日期:

create_table "test", :force => true do |t|
     t.date  "day"
end

我想将当前日期设置为此列的默认值。 我尝试如下:

create_table "test", :force => true do |t|
     t.date  "day", :default => Date.today
end

但默认始终是2月1日,所以如果我明天创造新纪录,那一天仍然是2月1日(预计是2月2日)

感谢您的回复!

注意:我在rails 3中使用sqlite

5 个答案:

答案 0 :(得分:22)

Rails不支持迁移中的动态默认值。 迁移过程中的迁移将在数据库级别设置,并保持这种状态,直到迁移回滚,覆盖或重置为止。但是,您可以在模型级别轻松添加动态默认值,因为它是在运行时进行评估的。

1)使用after_initialize回调

设置默认值
class Test
  def after_initialize
    self.day ||= Date.today if new_record?
  end
end

仅当您需要在初始化后访问该属性并 之前保存记录时,才使用此方法。加载查询结果时,此方法会产生额外的处理成本,因为必须为每个结果对象执行块。

2)使用before_create回调

设置默认值
class Test
  before_create do
    self.day = Date.today unless self.day
  end
end

此回调是由模型上的create调用触发的。 There are many more callbacks。例如,在createupdate上验证之前设置日期。

class Test
  before_validation on: [:create, :update] do
    self.day = Date.today
  end
end

3)使用default_value_for宝石

class Test
  default_value_for :day do
    Date.today
  end
end

答案 1 :(得分:3)

刚刚完成Harish Shetty的回答 对于Rails应用程序,您必须使用以下语法:

  class Test < ActiveRecord::Base
    after_initialize do |test|
      test.day ||= Date.today if new_record?
    end
  end

答案 2 :(得分:1)

不要认为您可以在迁移中执行此操作。但是,Rails已经将一个created_at字段添加到新模型迁移中,可以执行您想要的操作。如果你需要你自己的属性做同样的事情,只需使用before_save或before_validate来设置它,如果它是零。

答案 3 :(得分:1)

您可以设置从Rails 5迁移的默认日期

create_table :posts do |t|
  t.datetime :published_at, default: -> { 'NOW()' }
end

在Rails仓库中有link

答案 4 :(得分:0)

我知道Mysql不接受默认列类型作为函数。我假设sqlite会是一样的。

http://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html