2010-11-13 32 views
1

je le scénario suivant et je ne suis pas sûr si je dois utiliser l'héritage de table héritage de classe ou simple:Héritage de classe ou d'héritage de table simple dans Rails 2.3

Class User 
    has_one :main_list 
    has_one :known_list 
    has_many :regular_lists 
end 

Class List 
    has_many :words 
end 

Class Word 
    belongs_to :list 
end 

Ce que je voudrais faire est d'avoir chaque type de liste différente être une classe différente, le problème est que si je fais cela, je devrais ajouter main_list_id, known_list_id, et regular_list_id à l'objet/classe Word. Cela semble lourd. Puis-je faire quelque chose comme:

Class MainList 
    has_many :words, :foreign_key => list_id 
end 

puis quelque chose comme:

@user.main_list.find_by_name("MainList")?

Le seul problème avec ceci est que quelqu'un pourrait nommer un RegularList "MainList".

Répondre

1

Vous pouvez faire quelque chose comme ceci:

Class User < ActiveRecord::Base 
    has_many :lists 
end 

Class List < ActiveRecord::Base 
    belongs_to :user 
    has_and_belongs_to_many :words 
end 

Class Word < ActiveRecord::Base 
    has_and_belongs_to_many :lists 
end 

Sur la classe liste, vous pouvez ajouter deux champs booléens à la liste; un pour main_list et l'autre pour known_list. Sur cette classe, vous pouvez également ajouter des validations pour vous assurer que chaque utilisateur n'a qu'une liste principale et une liste connue. Pour sélectionner la liste principale pour un utilisateur, vous pouvez faire:

@user.lists.find(:first, :conditions => {:main_list => true}) 
+0

Idée intéressante, mais qu'en faire @ user.regular_lists maintenant? Cela ne va-t-il pas retourner toutes les listes, y compris les listes main_list et known_list? Un index sur ces champs booléens serait-il approprié? – TenJack

+0

Pour les trouver, ce serait @ user.lists.find (: first,: conditions => {: main_list => false,: liste_connue => false}). Vous pouvez également simplifier cela en créant des étendues nommées. Et non, ce ne serait pas une bonne idée d'indexer les champs booléens ... il suffit d'indexer l'id_utilisateur. –

+0

Modifier pour ci-dessus: la requête doit être @ user.lists.find (: all,: conditions => {: main_list => false,: known_list => false}) car il existe plusieurs listes régulières ... Désolé à ce sujet. –