2009-05-03 24 views
8

Tôi có nhu cầu về một mô hình (?) Trên ứng dụng của tôi về cơ bản có chứa trạng thái của một thực thể khác. Trong thực thể tôi muốn lưu trữ id của trạng thái, nhưng trong ứng dụng của tôi, chế độ xem đang nói về một mô tả từ tốt đẹp. Ví dụ: 1 = Mới, 2 = Được sử dụng, v.v.Rails - Constants Hash?

Làm cách nào để tôi thực hiện điều này một cách tốt nhất có nghĩa là tôi có thể dễ dàng đặt và truy xuất cột trạng thái này mà không lặp lại?

Cuối cùng tôi muốn một cái gì đó giống như

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

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

Tôi thậm chí nghĩ về điều này một cách đúng đắn?

Trả lời

14

Bạn có thể mã hóa một phương pháp nhà văn tùy chỉnh:

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 

Ví dụ, chương trình sau đây:

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}" 

kết quả đầu ra:

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

Một cách có thể được sử dụng hằng

module MyConstants 
    New = 1 
    Used = 2 
end 

Sau đó, bạn có thể sử dụng chúng như thế này

Foo.status = MyConstants::New 

hoặc thậm chí như thế này nếu bạn cẩn thận về namespace ô nhiễm

include MyConstants 
Foo.status = New 

On suy nghĩ khác, có thể bạn muốn sử dụng một state machine.

+0

Không chính xác những gì anh ấy muốn, tôi nghĩ, vì "Mới" (chuỗi) khác với MyConstants: Mới (đối tượng). –

3

Tôi chỉ muốn đi trước và sử dụng biểu tượng, một cái gì đó giống như

Foo.status = :new 

Họ chuỗi cơ bản không thay đổi, nghĩa là không có vấn đề bao nhiêu lần bạn sử dụng cùng một biểu tượng trong mã của bạn, nó vẫn là một đối tượng trong bộ nhớ:

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

Heh, Ruby dường như đã tìm thấy khá nhiều Lisp. – Svante