2009-05-30 9 views
0

J'apprends juste à programmer dans Ruby on Rails, et je suis vraiment impressionné par le travail que le framework Ruby on Rails fait pour vous. J'ai les deux catégories suivantes:Tables implicites dans Ruby on Rails

Object 
-------- 
object_id 
description 

ObjectGroup 
-------- 
group_id 
description 

L'idée est que j'ai quelques objets, et je voudrais que les utilisateurs soient en mesure de définir des groupes d'objets. Les rangées d'objets et les lignes ObjectGroup ont leurs propres identifiants et leurs données associées, ce qui est très intuitif en fonction des documents publiés sur le Web. Ma question est - comment puis-je stocker des informations sur les objets qui composent un ObjectGroup et utiliser au mieux le framework Ruby on Rails? La façon évidente de le faire dans SQL était d'utiliser une troisième table que les entrées stockées de la forme suivante:

ObjectGroupEntry 
-------- 
object_id 
group_id 

Chaque entrée dans la table ObjectGroupEntry représente un objet qui fait partie d'un ObjectGroup. Est-ce ma responsabilité de créer cette table manuellement et d'enseigner aux classes qui interagissent avec Objects et ObjectGroups comment interagir avec elle? Ou est-ce que Ruby on Rails fournit de la magie pour faire ceci que je n'ai pas encore trouvé?

Je pourrais le faire moi-même avec ce que je sais, mais j'apprends encore Ruby on Rails et j'aimerais apprendre le Right Way (TM) pour le faire.

+2

Probablement pas une bonne idée de créer réellement une classe appelée Objet, pensez-y. Cela pourrait avoir des répercussions assez importantes ... –

+0

D'accord, ce n'est qu'un exemple. –

Répondre

3

Avec Rails, c'est un peu des deux. Vous créez la table à l'aide d'une migration (ou autre méthode) avec la convention de dénomination normale, puis dans les modèles pour objet et ObjectGroup vous mettre dans la ligne:

==Object== 
has_and_belongs_to_many :object_groups 

==ObjectGroup== 
has_and_belongs_to_many :objects 

Tant que vous n'avez pas informations supplémentaires dans la table ObjectObjectGroup, c'est tout ce dont vous avez besoin. Sinon, vous auriez besoin d'un nouveau modèle, mais pourrait obtenir le même comportement comme ceci:

==Object== 
has_many :object_object_groups 
has_many :object_groups, :through => :object_object_groups 

==ObjectObjectGroup== 
belongs_to :object 
belongs_to :object_group 

==ObjectGroup== 
has_many :object_object_groups 
has_many :objects, :through => :object_object_groups 

indiquant la relation has_many avec le: par attribut pour obtenir un grand nombre à plusieurs rapports et permettant l'accès à d'autres informations sur la relation ainsi que.

+0

Quelle est la convention de dénomination normale? Pouvez-vous renommer ObjectObjectGroup en ObjectGroupList? Désolé, je suis facilement confus. :) –

+0

http://itsignals.cascadia.com.au/?p=7 pour les conventions de nommage. Vous pouvez fournir vos propres tableaux et modèles, et outrepasser les conventions, mais c'est (intentionnellement) plus de travail que simplement aller avec les conventions en premier lieu et je n'ai jamais pris la peine de me souvenir comment le faire :) – workmad3

+0

Son has_and_belongs_to_many and has_many : through => – nitecoder

1

Je pense que vous trouverez qu'il est

has_many :object_object_groups 
has_many :objects, :though => :through => :object_object_groups 

plutôt que ce workmad3 a déclaré. Toutes les autres informations fournies sont exactes, c'est juste une erreur de syntaxe.