2010-11-19 9 views
0

Je voulais vraiment essayer de comprendre comment utiliser une catégorie ou un type de hachage ou de tableaux dans les modèles, mais j'ai l'impression d'être un peu confus. Voici ce que j'essaie de faire et j'apprécierais toute aide. J'ai un modèle d'alerte dans mon application et j'avais à l'origine une table Alert_Type mais je voulais m'en débarrasser parce qu'il y avait plus de requêtes que j'en avais besoin pour vraiment seulement un type d'alerte élevé, moyen, bas, donc j'étais va les déplacer dans le modèleRuby on Rails - Modèle de hachage pour la balise Select

SEVERITY = { "High" => :high, 
       "Medium" => :medium, 
       "Low" => :low } 

<%= select :alert, :severity, Alert::SEVERITY, {:prompt => "Select one"} %> 

Je me sens comme cela est incorrect parce que quand je tire la valeur de base de données, il est élevé, faible, moyenne, mais ont besoin pour obtenir le texte de cette valeur. Quand j'ai fait ceci,

SEVERITY = { :high => "High" 
        :medium => "Medium", 
        :low => "Low" } 

J'ai eu des problèmes avec les listes déroulantes. J'essaie de comprendre l'approche des meilleures pratiques afin que lorsque je pourrais avoir besoin de traductions, cela fonctionnerait correctement. Dois-je faire un hachage ou juste un tableau. Merci beaucoup!

Répondre

0

La méthode select a besoin d'un tableau comme argument avec la forme 3th suivante:

[["field for_value_1", "field_for_name_attr_1"], 
["field for_value_2", "field_for_name_attr_2"], 
["field for_value_n", "field_for_name_attr_n"]] 

ou

["field for_value_and_attr_1", "field_for_value_and_attr_2","field_for_value_and_attr_n"] 

hashs ne devraient pas travailler. Pour avoir un tableau que vous pouvez faire

SEVERITY = { :high => "High" 
        :medium => "Medium", 
        :low => "Low" } 
<%= select :alert, :severity, Alert::SEVERITY.to_A, {:prompt => "Select one"} %> 

Et passer à la méthode un tableau. FYI, c'est mieux la deuxième option (mon hachage SEVERITY), parce que (si vous connaissez ce foget :) dans Ruby, le: un,: deux,: trois choses sont des instances de la classe Symbol. La classe de symboles est un type spécial de chaîne: chaque symbole est singleton en mémoire.

Cette caractéristique a rendu parfait pour les clés de hachage, parce que toujours: terme ==: terme (« terme » = « terme », beacuse il y a des cas différents)

Et pour les valeurs dans le hachage, son yout élection (pour votre cas, la meilleure approche est les cordes)

J'espère que cela aide.

+0

Merci pour la suggestion, je pense que cela fait beaucoup de sens. Je l'ai mis en œuvre comme cela dans le code avant que vous avez répondu – bokor

+0

essayé ce premier et avait ceci dans la recherche dans la vue Alert :: SEVERITY [alert.severity.to_sym] – bokor

+0

Je ne vous sous-entends pas, désolé :(. besoin d'accéder à Alert :: SEVERITY à partir de la vue? Utilisez cattr_reader ou créez une méthode de classe dans le modèle: def self.severity; Alert :: SEVERITY; end Et vous pouvez invoquer dans la vue Alert.severity – pablorc