2009-05-03 47 views
8

我的應用程序需要一個模型(?),它基本上包含另一個實體的狀態。在實體中,我想存儲狀態的id,但在我的應用程序中,視圖是用一個很好的單詞描述來說話的。例如,1 =新的,2 =使用的等等Rails - 常量散列?

我該如何去實現這個最好的方式,這意味着我可以輕鬆地設置和檢索這個狀態列而不必重複自己?

最後,我想是這樣

Foo.status = 'New' (actually sets value to 1) 

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

上午我甚至在想這個以正確的方式?

回答

14

您可以編寫定製寫入方法:

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 
0

的一種方式,可以使用常量

module MyConstants 
    New = 1 
    Used = 2 
end 

然後你可以使用他們喜歡這個

Foo.status = MyConstants::New 

也不像這個,如果你小心關於命名空間polution

include MyConstants 
Foo.status = New 

在又一想,也許你想使用state machine

+0

不正是他想要的,我認爲,因爲「新」(字符串)不同於MyConstants:New(對象)。 – 2009-05-03 22:06:25

3

我只是繼續和使用的符號,像

Foo.status = :new 

,他們基本上不變的字符串,也就是說,不管你有多少次使用相同的符號在你的代碼,它仍然是一個對象在內存中:

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

heh,Ruby似乎發現了很多Lisp。 – Svante 2009-05-04 01:53:34