您可以为动态初始化程序传递一个 lambda。
create_table "test", :force => true do |t|
t.date "day", default: -> { 'CURRENT_DATE' }
end
旧答案
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。例如,在create 和update 上设置验证前的日期。
class Test
before_validation on: [:create, :update] do
self.day = Date.today
end
end
3) 使用default_value_for gem
class Test
default_value_for :day do
Date.today
end
end