2010-07-03 2 views
3

Ce n'est pas un article de blog, c'est une question!
En parlant de types, je veux dire que nous avons une description de type et de type. Nous pouvons avoir différents types (genre, taille, couleur et etc.) et une collection de valeurs pour chaque type. Nous avons 2 choix: garder les types dans la base de données ou dans l'application.
Pour moi garder la table entière pour stocker les valeurs de type pour chaque type est redondant. Une autre méthode consiste à stocker des types dans une seule table avec des champs: nom du type, valeur du type, description du type. Pour garder le type dans db utile si vous souhaitez modifier ses valeurs à partir de l'application. Mais surtout quand j'ajoute un nouveau type, je change le comportement de l'application.
Pour moi, le meilleur choix est de garder les types dans l'application. Je fichier de configuration YML comme celui-ci (en fait, il est une partie de SettingsLogic fichier de paramètres):Où gardez-vous habituellement les types dans les rails?

types: 
    gender: "male female" 

Faire de cette façon, je peux valider les entrées de formulaire:

validates_inclusion_of :gender, :in => Settings.types.gender.split(/\s/) 

En ce qui concerne mon application est multilingue Je garde les descriptions dans les fichiers de localisation:

ru: 
    types: 
    gender: 
     male: "Мужской" 
     female: "Женский" 

pour préparer une collection de choix pour cette sélection que j'utilise la méthode d'aide:

def genders 
    genders = [] 
    Settings.types.gender.split(/\s/).each do |gender| 
    genders << [t("types.gender.#{gender}"), gender] 
    end 
    genders 
end 

L'inconvénient de cette approche est que je dois garder à type long db valeurs mâle et femme au lieu de suffisamment m et f.
Je pense donc d'un hachage maintenant:

def genders 
    genders = [] 
    gender_types = { :m => "male", :f => "female" } 
    gender_types.each do |key, value| 
    genders << [t("types.gender.#{value}"), key] 
    end 
    genders 
end 

Mais pour l'instant je n'ai pas la réponse où garder hash comme je le fais avec des chaînes dans le fichier de configuration. Comme je l'ai mentionné, ce hachage devrait être accessible non seulement à partir de la méthode d'assistance, mais aussi dans les validations. Donc, la question est assez large: Comment gardez-vous les types? Quelle est la meilleure ou la meilleure approche?

Répondre

3

je fais quelque chose de similaire en utilisant hash:

class RealtyRequest < ActiveRecord::Base 
    TYPOLOGY = { 'One' => 1, 'Two' => 2, 'Three' => 3 } 

    def typology 
    TYPOLOGY.invert[typology_id] 
    end 
end 

le modèle est une vraie table et je stocke une valeur entière, puis-je obtenir la valeur de chaîne avec une méthode.

Lors de l'utilisation des collections pour sélectionner, vous pouvez utiliser le hachage:

<div class="field"> 
    <%= f.label :typology_id %><br /> 
    <%= f.select :typology_id, RealtyRequest::TYPOLOGY %> 
</div> 

acclamations,

a.

+0

J'aime votre solution. Merci! – Voldy

+0

J'utilise cette approche très souvent parce que c'est simple et fonctionne très bien. content de vous aider :-) –

Questions connexes