ruby-on-rails – Rails迁移将当前日期设置为默认值

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails迁移将当前日期设置为默认值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在表格中有一列列日期:
create_table "test",:force => true do |t|
     t.date  "day"
end@H_403_3@ 
 

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

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

但是默认是2月1日,所以如果我明天创造新的纪录,那么今天还是2月1日(期望是2月2日)

感谢您的回应!

注意:我在rails 3中使用sqlite

解决方法

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

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

class Test
  def after_initialize
    self.day ||= Date.today if new_record?
  end
end@H_403_3@ 
 

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

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

class Test
  before_create do
    self.day = Date.today unless self.day
  end
end@H_403_3@ 
 

此回调由您的模型上的创建调用触发.
There are many more callbacks.例如,在创建和更新之前设置验证之前的日期.

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

3)使用default_value_for宝石

class Test
  default_value_for :day do
    Date.today
  end
end@H_403_3@

猜你在找的Ruby相关文章