Ruby on rails Rails3:定义枚举并将其用作db列的自定义类型
rails新手,因此不确定这里的最佳方法是什么。我想定义一个简单的C++样式枚举,然后可以在我的数据库中用作自定义类型。枚举可以用数组或自定义模块模拟,但如何将其转换为表的自定义类型?您是否考虑过在数据库中使用内置枚举支持?许多常见的RDMBSE都支持枚举,例如Postgres(请参阅)和MySQL(请参阅)。这样,您就可以直接在数据存储中创建类型,然后通过一个ActiveRecord插件(例如Postgres的enum_type:)使用它Ruby on rails Rails3:定义枚举并将其用作db列的自定义类型,ruby-on-rails,custom-type,Ruby On Rails,Custom Type,rails新手,因此不确定这里的最佳方法是什么。我想定义一个简单的C++样式枚举,然后可以在我的数据库中用作自定义类型。枚举可以用数组或自定义模块模拟,但如何将其转换为表的自定义类型?您是否考虑过在数据库中使用内置枚举支持?许多常见的RDMBSE都支持枚举,例如Postgres(请参阅)和MySQL(请参阅)。这样,您就可以直接在数据存储中创建类型,然后通过一个ActiveRecord插件(例如Postgres的enum_type:)使用它 或者,您可以使用类似active_enum的内容,按照
或者,您可以使用类似active_enum的内容,按照所述构造枚举,并将字段作为整数存储在数据库中。以下是我在rails中遵循的模式: 在我的模型类中,我添加了一个
模块
,以保存列的可能值。然后我将它们放入一个数组中,并根据可能值的数组定义验证
假设我有一个名为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
classmymodeltrue
#用所有可能的值定义一个模块
模块状态
发展中=‘发展中’
DISABLED='DISABLED'
活动='活动'
结束
#现在创建一个可能的状态值数组,并添加一个验证
状态=[状态::禁用,状态::活动,状态::正在开发]
验证:status,:inclusion=>{:in=>status,:message=>“%{value}不是有效的状态值”}
结束
根据您计划如何在代码中使用此枚举类型,我发现使用作用域和数据库中的枚举类型可以完成几乎相同的任务,以确保只设置特定的值
例如:
scope :trial, :conditions => { :utype => 'TRIAL' }
scope :registered, :conditions => { :utype => 'REGISTERED' }
scope :active, :conditions => { :status => 'ACTIVE' }
scope :abuse, :conditions => { :status => 'ABUSE' }
谢谢Kevin,我以前也尝试过类似的方法,但是迁移没有将数组定义识别为自定义类型。我得到一个错误,说#无法转储表“hostprofiles”,因为下面是StandardError#列“service”的未知类型“SERVICES”。一般来说,我发现最好暂停过去的实践,并在这种情况下尝试“走正轨”。不可避免地,事情进展得更快、更顺利。为什么自定义类型如此重要?你能使用rails附带的类型吗?@KevinBedell你能解释一下该模块的用途或需要,而不仅仅是给出一个值数组吗?我只是好奇,其实我不知道。谢谢你的链接,我会调查的。