2009-05-03 644 views
8

Necesito un modelo (?) En mi aplicación que básicamente contiene el estado de otra entidad. En la entidad, quiero almacenar el id del estado, pero en mi aplicación, la vista habla en términos de una buena descripción de palabras. Por ejemplo, 1 = Nuevo, 2 = Usado, etc. etc.Rieles - Constantes Hash?

¿Cómo puedo implementar esto de la mejor manera, lo que significa que puedo configurar y recuperar fácilmente esta columna de estado sin repetirme?

En última instancia me gustaría algo así como

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

y

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

¿Estoy incluso pensando en esto de la manera correcta?

Respuesta

14

Puede codificar un método escritor de encargo:

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 

Por ejemplo, el siguiente programa:

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

salidas:

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

Una forma podría estar utilizando constantes

module MyConstants 
    New = 1 
    Used = 2 
end 

A continuación, puede utilizarlos como esto

Foo.status = MyConstants::New 

ni aun como este si estás cuidado acerca de la contaminación del espacio de nombres

include MyConstants 
Foo.status = New 

En otro pensamiento, tal vez desee utilizar un state machine.

+0

No es exactamente lo que él quería, creo, ya que "Nuevo" (la cadena) es diferente de MyConstants: Nuevo (el objeto). –

3

que acababa de seguir adelante y utilizar símbolos, algo así como

Foo.status = :new 

Son cadenas básicamente inmutables, lo que significa que no importa cuántas veces se utiliza el mismo símbolo en el código, sigue siendo un objeto en memoria:

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

Heh, Ruby parece haber encontrado bastantes Lisp. – Svante