如何创建枚举类型并默认为新对象的特定值

时间:2013-11-14 18:20:41

标签: ruby-on-rails ruby

我有一个模特

class Transaction < ActiveRecord::Base

end

我有一个transaction_type列,它是一个整数。

如何创建一个枚举,我可以将值映射到名称,如:

one_time = 1
monthly = 2
annually = 3

因此在db列中,值为1,2或3.

此外,每当我创建新实例或保存模型时,该字段都未设置为:

@transaction = Transaction.new(parmas)

默认为1(on_time)。

我不确定我该怎么做?

3 个答案:

答案 0 :(得分:3)

与Amit基本相同的答案,轻微变化

class TransactionType
  TYPES = {
    :one_time => 1,
    :monthly => 2,
    :annually => 3
  }

  # use to bind to select helpers in UI as needed
  def self.options
    TYPES.map { |item| [item[0], item[1].to_s.titleize] }
  end

  def self.default
    TYPES[:one_time]
  end
end

控制默认值的一种方法

class Transaction < ActiveRecord::Base
  before_create :set_default_for_type

  def set_default_for_type
    type = TransactionType.default unless type.present?
  end
end

- 最好的方法是在数据库列上应用默认值,让ActiveRecord自动从中获取

注意:只有一个TransactionType ActiveRecord对象而不是上面的对象也可能有意义,取决于你的情况,即

# on Transaction with type_id:integer
belongs_to :type, class_name: "TransactionType" 

答案 1 :(得分:2)

您可以通过在同一Transaction模型中创建常量或通过创建新模块并将其置于其中来映射值,如@KepaniHaole所述

Transaction模型中,您可以这样做:

class Transaction < ActiveRecord::Base

  TRANSACTION_TYPES = { 'one_time' => 1, 'monthly' => 2, 'monthly' => 3 }

end

您可以通过访问常量

来访问这些值
Transaction::TRANSACTION_TYPES['one_time']    # => 1
Transaction::TRANSACTION_TYPES['monthly']     # => 2
Transaction::TRANSACTION_TYPES['monthly']     # => 3

要向transaction_type列添加默认值,只需使用以下命令创建新迁移:

def up
  change_column :transactions, :transaction_type, :default => Transaction::TRANSACTION_TYPES['one_time']
end

这样,每次创建Transaction对象而不传递transaction_type时,默认值1都会存储在其中。

答案 2 :(得分:1)

也许你可以试试这样的东西? Ruby并不真正支持c风格的枚举..

module TransactionType
  ONCE = 1
  MONTHLY = 2
  ANUALLY = 3
end

然后您可以像这样访问他们的值:

@transaction = Transaction.new(TransactionType::ONCE)