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

ban*_*hay 13 migration ruby-on-rails

我在表中有一个列日期:

create_table "test", :force => true do |t|
     t.date  "day"
end
Run Code Online (Sandbox Code Playgroud)

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

create_table "test", :force => true do |t|
     t.date  "day", :default => Date.today
end
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的回复!

注意:我在rails 3中使用sqlite

Har*_*tty 22

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

1)使用after_initialize回调设置默认值

class Test
  def after_initialize
    self.day ||= Date.today if new_record?
  end
end
Run Code Online (Sandbox Code Playgroud)

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

2)使用before_create回调设置默认值

class Test
  before_create do
    self.day = Date.today unless self.day
  end
end
Run Code Online (Sandbox Code Playgroud)

此回调是由create模型上的调用触发的. 还有更多的回调.例如,在create和之前设置验证之前的日期update.

class Test
  before_validation on: [:create, :update] do
    self.day = Date.today
  end
end
Run Code Online (Sandbox Code Playgroud)

3)使用default_value_for gem

class Test
  default_value_for :day do
    Date.today
  end
end
Run Code Online (Sandbox Code Playgroud)


Mau*_*uro 5

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

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

这是来自 rails repo的链接