2009-05-03 7 views
8

J'ai besoin d'un modèle (?) Sur mon application qui contient essentiellement le statut d'une autre entité. Dans l'entité, je veux stocker l'identifiant de l'état, mais dans mon application, la vue parle en termes d'une belle description de mot. Par exemple, 1 = Nouveau, 2 = Utilisé, etc.Rails - Constantes Hash?

Comment puis-je implémenter ceci de la meilleure façon que je peux facilement définir et récupérer cette colonne d'état sans me répéter?

En fin de compte, je voudrais quelque chose comme

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

et

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

-ce que je pense même à ce sujet dans le droit chemin?

Répondre

14

Vous pouvez coder une méthode d'écriture personnalisée:

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 

Par exemple, le programme suivant:

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

sorties:

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

Une façon pourrait utiliser des constantes

module MyConstants 
    New = 1 
    Used = 2 
end 

Ensuite, vous pouvez les utiliser comme cette

Foo.status = MyConstants::New 

ou même comme si vous êtes à propos de l'espace de noms carefull polution

include MyConstants 
Foo.status = New 

Sur une autre pensée, peut-être vous voulez utiliser un state machine.

+0

Pas exactement ce qu'il voulait, je pense, puisque "New" (la chaîne) est différente de MyConstants: New (l'objet). –

3

Je viens d'aller de l'avant et utiliser des symboles, quelque chose comme

Foo.status = :new 

Ils sont essentiellement des chaînes immuables, ce qui signifie que peu importe combien de fois vous utilisez le même symbole dans votre code, il est encore un objet en mémoire:

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

Heh, Ruby semble avoir trouvé pas mal de Lisp. – Svante