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?
Réponses
Trop de publicités?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.
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.
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.