2010-05-23 4 views
0

J'ai besoin de modéliser Propriétaires et Rentes dans une application, donc vous avez des choses qui sont toujours possédées par quelqu'un et peuvent être louées pour quelqu'un d'autre. J'ai d'abord abordé ce problème avec Single Table Inheritance car les deux types de personne partageront tous les attributs, de sorte que vous auriez un modèle appelé Person associé à une table dont les propriétaires et Rentee hériteraient de Person. Le problème est que l'héritage de type unique discerne les sous-types en utilisant un type de champ et donc un enregistrement dans la table peut représenter un propriétaire ou un locataire mais pas les deux en même temps, tandis que dans le contexte réel, vous pouvez avoir un propriétaire. qui est la location de quelque chose d'un autre propriétaire et donc cette personne est en même temps un propriétaire et un locataire.Rails - hiérarchie d'héritage des classes où un sous-type peut jouer deux rôles

Comment aborderiez-vous ce problème? Utiliseriez-vous des tables séparées pour les propriétaires et les locataires? Existe-t-il un autre type d'héritage de table dans Rails?

Répondre

1

Je suggère que vous restiez simple. Vous avez des gens qui peuvent à la fois louer et posséder des objets - les mêmes personnes, les mêmes objets - juste ajouter un moyen de suivre qui possède et article et qui l'a loué.

Vous pourriez faire quelque chose comme ceci:

class Person 
    has_many :items 
    has_many :rented_items, :class_name => "Item", :foreign_key => "rentee_id" 
end 

class Item 
    belongs_to :person 
    belongs_to :rentee, :class_name => "Person", :foreign_key => "rentee_id" 
end 

# so you have: 
person.items # all the items a person owns 
person.rented_items # all the items he has rented 
+0

C'est une approche agréable, la simplicité est toujours bon. Cependant, comment obtiendriez-vous efficacement la liste de tous les propriétaires et la liste de tous les bénéficiaires? – Miquel

+0

Vous pouvez obtenir une liste de tous les ID de propriétaire à partir de la table Item en utilisant: option groupe (group by person_id), puis récupérez ces enregistrements à partir de la table Person. L'autre option, probablement meilleure, consiste à utiliser l'option belongs_to counter_cache et à mettre en cache le nombre d'éléments loués/possédés pour chaque personne. Ensuite, vous pourriez facilement obtenir tous les propriétaires et les propriétaires (par exemple Person.find (: conditions => 'items_count> 0')). –

Questions connexes