2009-03-05 3 views
13

Je pense à un site de réseautage social. Mon modèle utilisateur devrait avoir un attribut "eyecolor", qui pourrait être défini sur une page de vue avec une liste de sélection/dropdownlist.Meilleure pratique: dois-je utiliser un modèle AR ou un hachage global pour les données statiques?

Ma question: -> devrais-je faire un AR-Model ou devrais-je utiliser un Hash/Constant global pour les données? Existe-t-il une meilleure pratique pour les "modèles statiques"?

Et comment puis-je associer suivant sans AR-modèle avec les relations:

u = User.first 
u.eyecolor 
==> 1 (not the eyecolor-string!) 

Ce que je besoin est la couleur des yeux cordes:

u = User.first 
u.eyecolor 
==> "brown" 

Merci, désolé pour mon mauvais anglais!

Répondre

8

Vous pouvez créer un modèle pour gérer votre logique couleur des yeux:

class EyeColor 
    COLORS = ['blue','brown','hazel'] 

    attr_accessor :color 

    # Some logic methods... 
    def is_brown? 
    self.color == 'brown' 
    end 

end 

Note: Ce modèle est un modèle Active Record, mais il crée une abstraction de l'objet dans le monde réel que vous essayez de modèle.

EDIT: J'aime aussi cette approche par opposition à un hachage global, car elle permet d'organiser votre définition statique au sein d'EyeColor au lieu de flotter dans votre programme, ce qui indique clairement où se trouve cette définition.

<%= select :user, :eye_color, EyeColor::COLORS %> 

EDIT: ajout d'un point d'interrogation à la méthode sous-jacente.

+0

L'autre bonne chose à propos de cette approche particulière est que vous avez une opportunité de passer à autre chose si vous trouvez que l'abstraction devient plus grande qu'une simple recherche. Essentiellement le refactor devient une question d'ajouter quelques méthodes ou de faire hériter la classe de AR. – robertpostill

+0

J'aime vraiment cette idée mais j'ai de la difficulté à trouver un code qui fonctionne pour moi. Dans mon site, je souhaite autoriser l'administrateur à modifier le nom du site (SITE_NAME) et à le stocker dans la base de données. Cependant, je pense que c'est trop pour récupérer SITE_NAME chaque fois que j'ai besoin d'afficher une page. Pourriez-vous donner un peu plus de détails sur la section «Quelques méthodes logiques ...» de votre réponse? :) Merci! Richard –

+0

http://pastie.org/482993 J'ai mocké du code ici.Est-ce que cela a l'air réalisable ou est-ce que je suis sur la mauvaise route? –

5

Ce que vous voulez est une constante. Je les mets dans un fichier dans config/initializers/constants.rb; De cette façon, ils sont tous au même endroit.

EyeColors = %w{Blue Brown Hazel Green} 

Dans votre formulaire juste faire:

<%= f.select :eye_color, EyeColors %> 
0

Vous pouvez vérifier dans constant_cache. Le stockage de ces informations dans la base de données, mais leur mise en cache, vous permet d'ajouter/de supprimer des constantes (dans la base de données) sans modifier votre code réel.

4

Si vous avez des données, vous devriez les mettre dans la base de données. Cela ne signifie pas que vous devez charger chaque fois que vous utilisez:

class EyeColor < ActiveRecord::Base 
    has_many :users 

    def self.allowed_eye_colors 
    @@eye_colors ||= AllowedEyeColor.find(:all) 
    end 
end 

Vous accédez à ce que EyeColor.allowed_eye_colors. Il est chargé la première fois que vous l'utilisez, puis mis en cache dans la variable de classe.

+1

A donné un vote pour cela un an plus tard. Je l'aime mieux que ma propre réponse. –

Questions connexes