Rails3:定义枚举并将其用作db列的自定义类型

时间:2012-05-31 23:52:43

标签: ruby-on-rails custom-type

rails的新手,所以不确定这里最好的方法是什么。我想定义一个简单的c ++样式枚举,然后可以在我的数据库中用作自定义类型。可以使用数组或自定义模块模拟枚举,但如何将其转换为我的表的自定义类型?

3 个答案:

答案 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' }