rails - 为枚举字段应用默认值

时间:2016-01-31 09:11:20

标签: ruby-on-rails

我希望我的枚举字段有一个默认值,以防止它为零。我做了以下事情:

# 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环境的特殊性吗?

2 个答案:

答案 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 +

从Rails 6.1开始,可以在模型中直接设置默认枚举值。例如:

class Template < ActiveRecord::Base
  enum status: [:draft, :published], _default: :draft
end

这里是a link to relative PRa link to the docs