在Rails中正确存储"枚举"模型

Rya*_*ner 18 ruby-on-rails

如果问题有点不精确,请道歉,但我会在下面描述我的问题.

我在Rails项目中设置了一些模型,有一件事我注意到我遇到了几次以上的事情是处理符合以下条件的属性:

  • 它们可以设置为一组小的预定义值
  • 这些值需要同时具有名称和标识符(无论是数字ID,代码还是其他)
  • 这些值只会随着大量代码更改而改变.

例如,我的一个模型应该有一个status可以设置为以下之一的字段:定义,执行或完成.我需要在界面中显示那些特定的单词,但是我不想将这些字符串存储在DB中,以防我将来需要更改它们(或者国际化,或者其他什么.)

显而易见的选择是为每个模型定义模型,但这似乎在维护模型时会产生大量开销,确保我在环境之间编写迁移等等,这对于每个模型来说都是如此.高架.

另一种选择是将它存储为一个整数,并打出一个"枚举"类型类来存储这些值的转换 - 这可能会正常工作,但我担心我会丢失关联和其他方便的东西我从ActiveRecord模型中获取.

有关处理这种情况的最佳方法的任何建议吗?

Pet*_*own 13

看看我一直在做的红宝石宝石叫做classy_enum.我很确定它完全符合您的要求.README有一些示例用法,但前提是它允许您将多个枚举成员定义为可以具有不同属性的类.


Ada*_*sek 12

定义一个varcharENUM在数据库中并验证模型中的字段:

validates_inclusion_of :status, :in => %w(Defining Executed Completed)
Run Code Online (Sandbox Code Playgroud)

Rails会将其视为字符串字段,但它仍然会验证值是什么.

如果您确实需要抽象状态字段的文本,则可以将其保存为整数:

class Foo < ActiveRecord::Base
  STATUS_DESCRIPTIONS = %w(Defining Executed Completed)

  def status
    STATUS_DESCRIPTIONS[ read_attribute(:status) ]
  end
end
Run Code Online (Sandbox Code Playgroud)

如果它变得更复杂,你应该尝试@ Beerlington的宝石.