[RUBY] Association (plusieurs à plusieurs)! !!

Qu'est-ce qu'une association? ?? : information_desk_person_tone2:

** En termes simples, il s'agit d'une association entre des tables utilisant un modèle. Associez les tables entre elles et passez d'un modèle à l'autre C'est pour le rendre accessible. ** **

* Cette fois, nous allons expliquer l'association "plusieurs-à-plusieurs". </ font>

Raisons de l'association

*** Dans Rails, il y a deux "associations" C'est la connexion entre les modèles Active Record. *** ***

Vous devez faire une association entre les deux modèles, Tu connais la raison?

*** C'est vrai, en associant des opérations de code plus courantes C'est simple et facile à faire. *** ***

Exemple: Association (plusieurs à plusieurs)

Cette fois, je voudrais expliquer avec la table des utilisateurs et la table des chambres.

Tout d'abord, considérons la relation entre chaque table et les autres tables.

** · Gérez la salle de chat à laquelle appartient l'utilisateur ** ** · Gérez quels utilisateurs sont dans la salle de chat **

Ce sera l'image suivante cette fois.

多対多.png

Le point à noter ici est la relation entre la table users et la table rooms. Dans cette conception de base de données, il existe une relation «plusieurs à plusieurs». ** "Many-to-many" est une relation dans laquelle chacun a plusieurs identifiants de table associés. ** </ font>

Dans ce cas, "un utilisateur appartient à plusieurs salles de chat" C'est une relation lorsque "plusieurs utilisateurs appartiennent à un salon de discussion".

Mais bon, pour montrer la relation de cette table, j'ai mis plusieurs valeurs sur la clé externe C'est facile si vous pouvez l'enregistrer, mais vous ne pouvez pas enregistrer plusieurs valeurs pour une colonne.

Une pratique courante consiste à ajouter plus de colonnes à mesure que le nombre d'ID associés augmente. Il y a un modèle. À titre d'exemple, je vais mettre l'image ci-dessous pour une compréhension facile.

無駄なカラム.png

Comme vous pouvez le voir sur l'image, je m'inquiète pour la colonne Il y a une colonne inutile.

Dans une telle conception de base de données, le nombre de colonnes augmente à mesure que le nombre d'enregistrements associés augmente. C'est une mauvaise conception, n'est-ce pas?

La ** table intermédiaire ** est utilisée pour résoudre ce problème.

Table intermédiaire

Maintenant, que pensez-vous d'un tableau intermédiaire, alors je vais l'expliquer brièvement. *** Une table intermédiaire, comme son nom l'indique, est une table entre deux tables. *** ***

Dans ce cas, nous allons créer une table intermédiaire entre la table des utilisateurs et la table des chambres.

*** La table intermédiaire est prise en sandwich entre deux tables qui ont une relation «plusieurs à plusieurs», et seuls les deux modèles de combinaison sont enregistrés en tant qu'enregistrements. *** ***

** De plus, seuls deux modèles ont une association "plusieurs à plusieurs" Il ne peut pas être assemblé. Par conséquent, nous utilisons une table intermédiaire pour définir une relation «plusieurs à plusieurs». ** **

中間テーブル.png

Je ne pourrai peut-être pas encore faire beaucoup d'images avec cette explication, alors Ensuite, je vais expliquer l'utilisation de SNS comme exemple. Le nom de la table sera modifié par rapport à l'explication suivante, donc il sera différent du nom de la table précédente. Je suis désolé si c'est difficile à comprendre. .. </ font>

Vérifions le rôle de la table intermédiaire en utilisant comme exemple l'application de publication de photos taguée

Imaginez une application de publication de photos telle que "Instagram" qui vous permet de marquer une seule photo plusieurs fois. Il existe trois tableaux pour réaliser la fonction de marquage comme "Instagram" Est requis. Table pour stocker les tags, table pour stocker les photos, Et c'est un tableau pour enregistrer "quelle balise est enregistrée dans quelle photo".

Parmi ceux-ci, les noms des tableaux qui stockent les photos et les balises peuvent être le tableau des balises et le tableau des photos. Le tableau "Quelle balise est ~ dans quelle photo" est le tableau photos_tags. Le nom des deux tables liées reliées par un trait de soulignement.

Les relations entre les enregistrements stockés dans chaque table sont les suivantes.

instagram.png

** Comme vous pouvez le voir sur l'image ci-dessus, le tableau intermédiaire contient des informations sur "quelle photo est associée au tag". Une combinaison de "photo_id x tag_id" est enregistrée dans un enregistrement, et les enregistrements sont accumulés pour le nombre de toutes les combinaisons de photo et de tag. Par exemple, si 10 photos ont chacune 3 balises différentes, 30 enregistrements seront générés dans le tableau intermédiaire pour représenter ces relations. ** **

Jusqu'à présent, nous avons expliqué comment enregistrer des informations dans la base de données à l'aide d'une table intermédiaire. De là, nous verrons comment mettre en place des associations à l'aide de tables intermédiaires.

Afin de faire une association à une table "plusieurs à plusieurs" via une table intermédiaire, il est nécessaire de décrire l'option through dans la méthode has_many qui a été utilisée jusqu'à présent. J'expliquerai ensuite l'option through.

par option

** L'option through de la méthode has_many est utilisée pour définir une association plusieurs-à-plusieurs pour le modèle. ** ** Comme le nom ** through signifie, cela signifie "via". ** ** Je publierai une image de référence d'une manière plus compréhensible.

参考.png

Lorsque vous utilisez l'option through pour définir une association plusieurs-à-plusieurs, écrivez ce qui suit pour chaque modèle.

models/photo.rb

class Photo < ApplicationRecord
  has_many :photos_tags
  has_many :tags, through: :photos_tags
end

models/tag.rb

class Tag < ApplicationRecord
  has_many :photos_tags
  has_many :photos, through: :photos_tags
end

models/photos_tag.rb

class PhotosTag < ApplicationRecord
  belongs_to :photo
  belongs_to :tag
end

Dans le modèle de deux tables dans une relation plusieurs-à-plusieurs, la méthode has_many définit des associations "un-à-plusieurs" les unes avec les autres. L'option through spécifie la table intermédiaire à parcourir.

En revanche, dans le modèle de table intermédiaire, la méthode appartient_to spécifie deux tables qui ont une relation plusieurs-à-plusieurs.

Voilà comment définir une association «plusieurs à plusieurs».

Résumé

** - Utilisez une table intermédiaire pour les associations "plusieurs à plusieurs" -Dans le modèle de deux tables dans une relation «plusieurs à plusieurs», la méthode has_many En plus de définir les associations «un-à-plusieurs» les unes des autres, Utilisez l'option through pour spécifier la table intermédiaire à parcourir **

Si cette explication est trop longue et difficile à comprendre, Excusez-moi. .. J'ai fait de mon mieux pour le rassembler, alors j'espère que cela vous aidera. </ font>

c'est tout.