Rails 新手,所以不确定这里有什么最好的方法。我想定义一个简单的 c++ 样式枚举,然后可以将其用作我的数据库中的自定义类型。枚举可以使用数组或自定义模块进行模拟,但我该如何将其转换为我的表格的自定义类型?
问问题
1948 次
3 回答
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
于 2012-06-01T20:38:46.497 回答
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 之类的东西来构造您所描述的枚举,并将字段作为整数存储在数据库中。
于 2012-06-01T00:28:06.993 回答
1
根据您计划如何在代码中使用此枚举类型,我发现使用范围与数据库中的枚举类型一起完成几乎相同的事情,以确保仅设置特定值。
例子:
scope :trial, :conditions => { :utype => 'TRIAL' }
scope :registered, :conditions => { :utype => 'REGISTERED' }
scope :active, :conditions => { :status => 'ACTIVE' }
scope :abuse, :conditions => { :status => 'ABUSE' }
于 2012-06-01T21:06:28.250 回答