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)
您可以设置从 Rails 5 迁移的默认日期
create_table :posts do |t|
t.datetime :published_at, default: -> { 'NOW()' }
end
Run Code Online (Sandbox Code Playgroud)
这是来自 rails repo的链接
归档时间: |
|
查看次数: |
9249 次 |
最近记录: |