如何使枚举字段可以在rails中更新?

时间:2016-12-09 18:24:57

标签: ruby-on-rails

我正在尝试创建一个简单的RoR应用程序。我遇到了用户类别的枚举问题。

class User < ApplicationRecord
  before_save :name_to_sentence_case

  extend Enumerize
  enumerize :category, in: [:admin, :staff, :customer]

  VALID_NAME_REGEX = /\A[a-z]+\z/i
  VALID_PHONE_REGEX = /\A[0-9]+\z/

  validates :first_name, presence: true, length: {maximum: 20}, format: {with: VALID_NAME_REGEX}
  validates :last_name, presence: true, length: {maximum: 30}, format: {with: VALID_NAME_REGEX}
  validates :category, presence: true
  validates :password, presence: true, length: {minimum: 6}
  validates :phone, presence: true, length: {maximum: 15}, uniqueness: true, format: {with: VALID_PHONE_REGEX}

  has_secure_password

  def name_to_sentence_case
    self.first_name = first_name.humanize
    self.last_name = last_name.humanize
  end
end

我可以从rails控制台创建用户并根据指定的类别设置类别,系统将不允许创建具有其他类别的用户。但是,即使存在正确的类别,我也无法更新现有用户的类别。

3 个答案:

答案 0 :(得分:0)

更好的方法是创建哈希。所以你只需更新一个数值。 例如

CATEGORY = {
  0 => 'admin',
  1 => 'staff',
  2 => 'customer'
}

您只需将值数值存储在数据库(0,1或2)中,您就可以从哈希中知道它是谁。

答案 1 :(得分:0)

Rails内置了enum帮助器。根据{{​​3}},您可以通过下一种方式使用它:

模特中的

enum category: [:admin, :staff, :customer]

您的category字段应为整数类型或

enum category: { admin: :admin, staff: :staff, customer: :customer }

如果你想要字符串类型字段

比您可以用非常简单的方式更新user

@user.admin!

答案 2 :(得分:0)

要详细说明Oleg's答案,您将能够将可枚举选项作为字符串传递给参数,即

@user.update(phone: "123-234-1234", category: 'admin')

或类别

@user.update(phone: "123-234-1234", category: :admin)

source code on github

的第21,22行