87 votes

has_and_belongs_to_many vs has_many à travers

Veuillez expliquer la différence entre has_and_belongs_to_many et has_many par le biais d'une relation. Quand et où utiliser lequel?

128voto

Dan Points 1235

Aussi loin que je me souvienne, has_and_belongs_to_many vous donne une simple table de recherche qui référence vos deux modèles.

Par exemple,

Les histoires peuvent appartenir à plusieurs catégories. Les catégories peuvent avoir de nombreuses histoires.

Categories_Stories Table
story_id | category_id

has_many :through vous donne un troisième modèle qui peut être utilisé pour stocker divers autres éléments d'information qui n'appartiennent pas à l'un des modèles originaux.

Par exemple

Personne peut s'inscrire à de nombreux magazines. Les Magazines peuvent avoir de nombreux abonnés.

Ainsi, nous pouvons avoir un modèle d'abonnement dans le milieu, ce qui nous donne une table similaire à l'exemple précédent, mais avec des propriétés supplémentaires.

Subscriptions Table
person_id | magazine_id | subscription_type | subscription_length | subscription_date 

Et ainsi de suite.

43voto

Tadas Tamosauskas Points 1090

À partir de http://guides.rubyonrails.org/association_basics.html#choosing-between-has-many-through-and-has-and-belongs-to-many

La règle la plus simple de base est que vous devez mettre en place un has_many :la relation d'aide si vous avez besoin de travailler avec le modèle de la relation comme une entité indépendante. Si vous n'avez pas besoin de faire quoi que ce soit avec le modèle de la relation, il peut être plus simple pour configurer une relation has_and_belongs_to_many (bien que vous aurez besoin de se rappeler de créer l'assemblage de la table dans la base de données). Vous devez utiliser has_many :through si vous avez besoin des validations, des rappels ou des attributs supplémentaires sur la jointure du modèle.

17voto

davidfurber Points 1698

Ma règle d'or est, puis-je me débrouiller avec une liste de cases à cocher ici? Si c'est le cas, alors c'est une association d'habtm. Si j'ai besoin de la case à cocher pour capturer davantage sur la relation que simplement oui / non, alors utilisez has_many: through. HABTM est aussi simple que d’utiliser la méthode _ids avec un simple_form collection_check_boxes. Has_many: through implique souvent includes_nested_attributes_for.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X