在我的模型的一个字段中,有一些常量表示有效选项.在Ruby中处理这些常量的最佳方法是什么?

推荐答案

为此,可以使用数组或哈希(在您的environment.rb中):

OPTIONS = ['one', 'two', 'three']
OPTIONS = {:one => 1, :two => 2, :three => 3}

或者是枚举类,它允许您枚举常量以及用于关联它们的键:

class Enumeration
  def Enumeration.add_item(key,value)
    @hash ||= {}
    @hash[key]=value
  end

  def Enumeration.const_missing(key)
    @hash[key]
  end   

  def Enumeration.each
    @hash.each {|key,value| yield(key,value)}
  end

  def Enumeration.values
    @hash.values || []
  end

  def Enumeration.keys
    @hash.keys || []
  end

  def Enumeration.[](key)
    @hash[key]
  end
end

然后你可以从中得出:

class Values < Enumeration
  self.add_item(:RED, '#f00')
  self.add_item(:GREEN, '#0f0')
  self.add_item(:BLUE, '#00f')
end

然后像这样使用:

Values::RED    => '#f00'
Values::GREEN  => '#0f0'
Values::BLUE   => '#00f'

Values.keys    => [:RED, :GREEN, :BLUE]
Values.values  => ['#f00', '#0f0', '#00f']

Ruby-on-rails相关问答推荐

带有rails 7.1的Lightbox2未初始化

Data-turbo-stream=&FALSE&QOOT;不适用于带有方法POST的表单

如何在Rails中创建没有字符串的查询

我可以向 erb 变量插值添加一个类吗?

Rails:当 id 方法为非标准时构建关联

如何在 Rails 中声明动态路由范围/命名空间变量?

为什么 Image_tag 产生images/...而不是assets/....?

无法加载此类文件 -- mysql2/mysql2

2个空格或1个制表符,Rails社区的缩进标准是什么?

jbuilder vs rails-api/active_model_serializers 用于 Rails 4 中的 JSON 处理

为什么在保存对象后使用重新加载方法? (Hartl Rails Tut 6.30)

如何使用失败try 次数使设计可锁定

什么是 Ruby 中的 Python 文档字符串?

在 ID 存在时获取表的未知主键

在 Rails/ActiveRecord 列名中使用问号字符

如何检测我的代码是否在 Rails 3 的控制台中运行?

如何覆盖:在 has_many 中定义的顺序

Mongoid OR 查询语法

Postgresql JSON 数据列不同

为什么不对 Rspec + Selenium 使用共享的 ActiveRecord 连接?