我在表格中有一个列日期:
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
答案 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。例如,在create
和update
上验证之前设置日期。
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