Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails3:定义枚举并将其用作db列的自定义类型_Ruby On Rails_Custom Type - Fatal编程技术网

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

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的内容,按照

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

您是否考虑过在数据库中使用内置枚举支持?许多常见的RDMBSE都支持枚举,例如Postgres(请参阅)和MySQL(请参阅)。这样,您就可以直接在数据存储中创建类型,然后通过一个ActiveRecord插件(例如Postgres的enum_type:)使用它


或者,您可以使用类似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你能解释一下该模块的用途或需要,而不仅仅是给出一个值数组吗?我只是好奇,其实我不知道。谢谢你的链接,我会调查的。