2010-12-10 6 views
1

J'ai deux modèles: User et HairColor. Un utilisateur a seulement une couleur de cheveux, mais peut avoir plusieurs préférences de couleur de cheveux. Quelle est la meilleure façon de modéliser cela?Rails: Comment modéliser les préférences? Dois-je utiliser has_many: through?

Voici ce que j'ai commencé à faire:

#models/user.rb 
class User < ActiveRecord::Base 
    belongs_to :hair_color 
    has_many :preferences, 
    has_many :hair_colors, :through => :preferences 
end 

#models/hair_color.rb 
class HairColor < ActiveRecord::Base 
    has_many :users 
end 

#models/preference.rb 
class Preference < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :hair_color 
end 

utilise-t-has_many: grâce à la bonne approche? Aussi, que faire si je veux étendre cela à d'autres attributs tels que "couleur des yeux"? (Un utilisateur a une couleur des yeux, mais peut préférer beaucoup de couleurs pour les yeux »

Répondre

1

Il y aura un nombre limité de couleurs de cheveux, de sorte que la table de préférence doit avoir un hair_color_id et être mis en place comme ceci:

#models/user.rb 
class User < ActiveRecord::Base 
    has_one :hair_color 
    has_many :preferences 
end 

#models/hair_color.rb 
class HairColor < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :preference 
end 

#models/preference.rb 
class Preference < ActiveRecord::Base 
    belongs_to :user 
    has_many :hair_color 
end 

Je crois que est exact. Faites-moi savoir si vous rencontrez des accrocs.


Lorsque vous ajoutez la couleur des yeux ou toute autre caractéristique, vous aurez probablement à faire quelque chose de différent avec une préférence. J'aurais 4 colonnes à ce moment-là: id, user_id, foreign_id, foreign_typeForeign_id serait l'id de la table eye_color/hair_color, et foreign_type serait "eye" ou "hair" ou quelque chose comme ça. Ensuite, dans votre modèle, vous auriez quelque chose comme ceci:

#models/hair_color.rb 
class HairColor < ActiveRecord::Base 
    belongs_to :user 
    has_many :preferences, :foreign_key => :foreign_id, :conditions => { "preferences.foreign_type" => "hair" } 
end 

qui obtient un peu fou, mais il est le moyen le plus sec de le faire. Vous mettez la même chose dans votre eye_color.rb et remplacez simplement "hair" par "eye" pour le type foreign_type.

+0

Merci! Je vais essayer ça. De même, pour ajouter d'autres préférences telles que Couleur des yeux, aurais-je juste besoin d'ajouter une colonne 'eye_color_id' à la table des préférences? Ou devrais-je séparer les préférences en modèles distincts, tels que "HairColorPreference" et "EyeColorPreference"? Je ne sais pas lequel serait le plus sec. – Chanpory

+0

Mis à jour pour une autre question. –

+0

Chuck, c'est génial. Je me suis arraché les cheveux en essayant de comprendre et de comprendre le has_many: à travers l'association. Cela semble être l'approche la plus sèche. Alors maintenant, je vais essayer et ensuite essayer d'obtenir un formulaire de travail pour la sélection des préférences dans un modèle de vue. Nouveau sur Ruby on Rails, mais j'espère que ce n'est pas trop dur. Merci! – Chanpory

Questions connexes