Rails - 常量哈希?

时间:2009-05-03 21:37:23

标签: ruby-on-rails ruby

我的app上需要一个模型(?),它基本上包含另一个实体的状态。在实体中我想存储状态的ID,但在我的应用程序中,视图是根据一个好的单词描述进行讨论。例如,1 = New,2 = Used etc等。

如何以最佳方式实现此功能,这意味着我可以轻松设置和检索此状态列而无需重复自己?

最终我想要像

这样的东西
Foo.status = 'New'  (actually sets value to 1)

Foo.status  (returns 'New', but stores 1)

我是否以正确的方式思考这个问题?

3 个答案:

答案 0 :(得分:13)

您可以编写自定义编写器方法:

STATUS_VALUES = { 1 => 'new', 2 => 'modified', 3 => 'deleted' }

class Foo
  attr_reader :status_id

  def status
    STATUS_VALUES[@status_id]
  end

  def status=(new_value)
    @status_id = STATUS_VALUES.invert[new_value]
    new_value
  end
end

例如,以下程序:

foo_1 = Foo.new

foo_1.status = 'new'
puts "status: #{foo_1.status}"
puts "status_id: #{foo_1.status_id}"

foo_1.status = 'deleted'
puts "status: #{foo_1.status}"
puts "status_id: #{foo_1.status_id}"

输出:

status: new
status_id: 1
status: deleted
status_id: 3

答案 1 :(得分:3)

我会继续使用符号,例如

Foo.status = :new

它们基本上是不可变的字符串,这意味着无论你在代码中使用相同的符号多少次,它仍然是内存中的一个对象:

>> :new.object_id
=> 33538
>> :new.object_id
=> 33538
>> "new".object_id
=> 9035250
>> "new".object_id
=> 9029510 # <- Different object_id

答案 2 :(得分:0)

一种方法可能是使用常量

module MyConstants
  New  = 1
  Used = 2
end

然后你可以像这样使用它们

Foo.status = MyConstants::New

或者甚至喜欢这样,如果你仔细考虑命名空间污染

include MyConstants
Foo.status = New

另一个想法,也许你想使用state machine