我想为枚举字段设置一个默认值,以防止它为nil。我做了以下工作:
# db/schema.rb
create_table "templates", force: :cascade do |t|
t.integer "status"
end
# app/models/template.rb
class Template < ActiveRecord::Base
STATUSES = [:draft, :published]
enum status: STATUSES
after_initialize :init
def init
self.status ||= STATUSES.index(:draft)
end
end
字符串
我在当地的环境中得到了预期的结果。但不完全是Heroku。在更新状态为nil
后,我需要它为默认值draft
,但在此上下文中,它变为nil
,而published
作用域仍然包含更新的行。
$ heroku run rails console
> Template.published.pluck :id
=> [1, 2]
> Template.find(1).update(status:nil)
Template Load (4.4ms) SELECT "templates".* FROM "templates" WHERE "templates"."id" = $1 LIMIT 1 [["id", 1]]
Template Load (4.4ms) SELECT "templates".* FROM "templates" WHERE "templates"."id" = $1 LIMIT 1 [["id", 1]]
(1.7ms) BEGIN
(1.7ms) BEGIN
(1.1ms) COMMIT
(1.1ms) COMMIT
=> true
> Template.find(1).status
=> nil
> Template.published.pluck :id
=> [1, 2]
型
这是使用枚举的正确用例吗?我的heroku环境有什么特殊之处吗?
5条答案
按热度按时间kg7wmglp1#
Rails 6.1+
从Rails 6.1开始,可以在模型中设置默认枚举值。举例来说:
字符串
这里是a link to relative PR和a link to the docs。
Rails 7+
从Rails 7开始,不再需要使用前导下划线。举例来说:
型
这里是a link to relative PR和文档的链接。
1hdlvixo2#
可以从数据库声明中设置默认值。
字符串
然后,Map关系如下
型
2ul0zpep3#
Rails 7
Rails 6.1允许在模型中设置默认枚举值。
Rails 7引入了定义枚举的新语法。例如:
字符串
这里有一个link to the relevant PR和一个边缘文档的链接。
olmpazwi4#
另一种方法是:
字符串
在这种情况下,你可以保持你的
migration
文件简单:型
f4t66c6m5#
Rails 7
如果希望枚举字段为字符串而不是整数,请使用下面的方法
字符串