我希望我的枚举字段有一个默认值,以防止它为零。我做了以下事情:
# 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中并不完全。在将状态更新为draft
后,我需要将其设置为默认值nil
,但在此上下文中它变为nil
,但published
范围仍包含更新的行。< / p>
$ 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环境的特殊性吗?
答案 0 :(得分:14)
您可以从数据库声明中设置默认值。
db.collection.insert(
<document or array of documents>
)
然后,将关系映射如下
create_table :templates do |t|
t.column :status, :integer, default: 0
end
答案 1 :(得分:7)
从Rails 6.1开始,可以在模型中直接设置默认枚举值。例如:
class Template < ActiveRecord::Base
enum status: [:draft, :published], _default: :draft
end