rails的新手,所以不确定这里最好的方法是什么。我想定义一个简单的c ++样式枚举,然后可以在我的数据库中用作自定义类型。可以使用数组或自定义模块模拟枚举,但如何将其转换为我的表的自定义类型?
答案 0 :(得分:6)
这是我在rails中遵循的模式:
在我的模型类中,我添加module
来保存列的可能值。然后我将它们放入一个数组中,并根据可能的值数组定义验证。
想象一下,我有一个名为status
的列/属性,它可以是三个可能的值。我这样做:
class MyModel < ActiveRecord::Base
# This validates that status can't be null
validates :status, :presence => true
# Define a module with all possible values
module Status
IN_DEVELOPMENT = 'in development'
DISABLED = 'disabled'
ACTIVE = 'active'
end
# Now create an array of possible status values, and add a validation
STATUSES = [ Status::DISABLED, Status::ACTIVE, Status::IN_DEVELOPMENT]
validates :status, :inclusion => { :in => STATUSES, :message => "%{value} is not a valid status value" }
end
答案 1 :(得分:1)
您是否考虑过在数据库中使用内置的枚举支持?许多常见的RDMBS都有枚举支持,例如Postgres(参见http://www.postgresql.org/docs/9.1/static/datatype-enum.html)和MySQL(参见http://dev.mysql.com/doc/refman/5.5/en/enum.html)。这样,您可以直接在数据存储中创建类型,然后通过其中一个ActiveRecord插件(例如Postgres的enum_type:https://github.com/riscfuture/enum_type)使用它。
或者,您可以使用类似active_enum的内容来构造所描述的枚举,并将字段存储为数据库中的整数。
答案 2 :(得分:1)
根据您计划在代码中使用此枚举类型的方式,我发现使用范围与数据库中的枚举类型完全相同,以确保只设置特定值。
示例:
scope :trial, :conditions => { :utype => 'TRIAL' }
scope :registered, :conditions => { :utype => 'REGISTERED' }
scope :active, :conditions => { :status => 'ACTIVE' }
scope :abuse, :conditions => { :status => 'ABUSE' }