2010-06-04 6 views
2

Je suis un programmeur C# et je cherche à rubis sur rails. mais j'ai quelques problèmes probablement avec l'ensemble de l'esprit ou quelque chose.Énumération en Ruby sur les rails

J'ai un objet Voter, cet objet peut être Pro, Neutre ou con.

Je normaly rendre l'objet de vote ont un champ quelque chose comme ce

private VoteEnum voteEnum = VoteEnum.Neutral 

comment diable puis-je acomplish cela en rubis.

j'ai trouvé quelques exemples comme:

def MyClass < ActiveRecord::Base 
    ACTIVE_STATUS = "active" 
    INACTIVE_STATUS = "inactive" 
    PENDING_STATUS = "pending" 
end 

Ensuite, lorsque vous utilisez le modèle d'une autre classe, je référence les constantes

@model.status = MyClass::ACTIVE_STATUS 
@model.save 

Cela semble correct pour moi, mais ma principale question est de savoir comment Dois-je dire au modèle que le statut est le type d'enum ou constain ..

J'espère que vous comprenez ma question, et j'espère que vous pouvez m'aider à m'en sortir.

Répondre

3

Ruby n'est pas strictement typé comme C#. Mais vous pouvez utiliser des validations pour vérifier ce qui est dans l'état:

def MyClass < ActiveRecord::Base 
    ACTIVE_STATUS = "active" 
    INACTIVE_STATUS = "inactive" 
    PENDING_STATUS = "pending" 
    NUMERICAL_STATUS = 500 # this is weird but okay 

    ALL_STATUSES = [ACTIVE_STATUS, INACTIVE_STATUS, PENDING_STATUS, NUMERICAL_STATUS] 

    validates_inclusion_of :status, :in => ALL_STATUSES 

end 
+0

Alors, quel type est le statut? chaîne? Je dois enregistrer la valeur dans la base de données. – LordSauron

+0

Oui, il ne sera sauvé avec succès dans une colonne de chaîne ... mais je vais modifier l'exemple un peu pour montrer une autre possibilité. – Koterpillar

+0

Cela aide allouer, désolé d'être un n00b géant, mais ne peut pas l'aider. savez-vous également comment l'utiliser dans les vues? comme un select ou quelque chose? – LordSauron

0

Normalement, si elle est juste un ENUM utilisé en C++ ou C#, je traduirais que comme suit:

class VoteStatus 
    ACTIVE_STATUS=0 
    INACTIVE_STATUS=1 
    PENDING_STATUS=2 
end 

de sorte que vous stocker un entier dans votre base de données, et la signification est claire dans votre code.

Cependant, je suggère d'utiliser une simple table de domaine pour cela. De cette façon, vous définissez et pouvez maintenir les statuts possibles dans votre base de données, vous définissez un identifiant, un nom et une description et soudainement vos statuts sont auto-documentés et les noms et descriptions peuvent également être affichés (en espérant que vous n'avez pas besoin de traductions :)