我有一个模特
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)。
我不确定我该怎么做?
答案 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)