[RUBY] Verein (viele zu viele)! !!

Was ist ein Verein? ?? : information_desk_person_tone2:

** Einfach ausgedrückt handelt es sich um eine Zuordnung zwischen Tabellen mithilfe eines Modells. Verknüpfen Sie die Tabellen miteinander und wechseln Sie von einem Modell zum anderen Es soll es zugänglich machen. ** ** **

* Dieses Mal erklären wir die "Viele-zu-Viele" -Zuordnung. </ font>

Gründe für die Assoziation

*** In Rails gibt es zwei "Assoziationen" Es ist die Verbindung zwischen Active Record-Modellen. *** ***

Sie müssen eine Verknüpfung zwischen den beiden Modellen herstellen. Kennst du den Grund?

*** Das ist richtig, indem Sie häufigere Codeoperationen zuordnen Es ist einfach und leicht zu tun. *** ***

Beispiel: Assoziation (viele zu viele)

Dieses Mal möchte ich mit dem Benutzertisch und dem Zimmertisch erklären.

Betrachten wir zunächst die Beziehung zwischen jeder Tabelle und anderen Tabellen.

** · Verwalten Sie, zu welchem Chatraum der Benutzer gehört ** ** · Verwalten Sie, welche Benutzer sich im Chatraum befinden **

Diesmal ist es das folgende Bild.

多対多.png

Der hier zu beachtende Punkt ist die Beziehung zwischen der Benutzertabelle und der Zimmertabelle. In diesem DB-Entwurf gibt es eine "Viele-zu-Viele" -Beziehung. ** "Viele-zu-Viele" ist eine Beziehung, in der jede mehrere verwandte Tabellen-IDs hat. ** </ font>

In diesem Fall "gehört ein Benutzer mehreren Chatrooms an" Es ist eine Beziehung, wenn "mehrere Benutzer zu einem Chatroom gehören".

Aber hey, um die Beziehung dieser Tabelle zu zeigen, habe ich dem externen Schlüssel mehrere Werte hinzugefügt Es ist einfach, wenn Sie es speichern können, aber Sie können nicht mehrere Werte für eine Spalte speichern.

Es ist üblich, mehr Spalten hinzuzufügen, wenn die Anzahl der zugeordneten IDs zunimmt. Es gibt ein Muster. Als Beispiel werde ich das Bild unten zum leichteren Verständnis einfügen.

無駄なカラム.png

Wie Sie auf dem Bild sehen können, mache ich mir Sorgen um die Spalte Es gibt eine nutzlose Spalte.

In einem solchen DB-Entwurf nimmt die Anzahl der Spalten mit zunehmender Anzahl zugehöriger Datensätze zu. Es ist ein schlechtes Design, nicht wahr?

Die ** Zwischentabelle ** wird verwendet, um dies zu lösen.

Zwischentisch

Was halten Sie von einer Zwischentabelle, daher werde ich sie kurz erläutern. *** Eine Zwischentabelle ist, wie der Name schon sagt, eine Tabelle zwischen zwei Tabellen. *** ***

In diesem Fall erstellen wir eine Zwischentabelle zwischen der Benutzertabelle und der Raumtabelle.

*** Die Zwischentabelle befindet sich zwischen zwei Tabellen, die eine "Viele-zu-Viele" -Beziehung haben, und nur die beiden Kombinationsmuster werden als Datensätze gespeichert. *** ***

** Außerdem haben nur zwei Modelle eine "Viele-zu-Viele" -Verbindung Es kann nicht zusammengebaut werden. Daher verwenden wir eine Zwischentabelle, um eine "Viele-zu-Viele" -Beziehung zu definieren. ** ** **

中間テーブル.png

Mit dieser Erklärung kann ich möglicherweise noch nicht viele Bilder machen Als nächstes werde ich die Verwendung von SNS als Beispiel erläutern. Der Tabellenname wird gemäß der folgenden Erläuterung geändert, sodass er sich vom vorherigen Tabellennamen unterscheidet. Es tut mir leid, wenn es schwer zu verstehen ist. .. </ font>

Lassen Sie uns die Rolle der Zwischentabelle am Beispiel der App für getaggte Fotopostings überprüfen

Stellen Sie sich eine Foto-Posting-App wie "Instagram" vor, mit der Sie ein einzelnes Foto mehrmals markieren können. Es gibt drei Tabellen, um die Tagging-Funktion wie "Instagram" zu realisieren. Wird benötigt. Tabelle zum Speichern von Tags, Tabelle zum Speichern von Fotos, Und es ist eine Tabelle zum Speichern "welches Tag auf welchem Foto registriert ist".

Von diesen sollten die Namen der Tabellen, in denen Fotos und Tags gespeichert sind, die Tags-Tabelle und die Fototabelle sein. Die Tabelle "Welches Tag ist ~ in welchem Foto" ist die Tabelle photos_tags. Der Name der beiden zugehörigen Tabellen, die durch einen Unterstrich verbunden sind.

Die Beziehungen zwischen den in jeder Tabelle gespeicherten Datensätzen sind wie folgt.

instagram.png

** Wie Sie dem obigen Bild entnehmen können, enthält die Zwischentabelle Informationen darüber, "welches Foto dem Tag zugeordnet ist". Eine Kombination von "photo_id x tag_id" wird in einem Datensatz aufgezeichnet, und Datensätze werden für die Anzahl aller Foto- und Tag-Kombinationen akkumuliert. Wenn beispielsweise 10 Fotos jeweils 3 verschiedene Tags haben, werden 30 Datensätze in der Zwischentabelle generiert, um diese Beziehungen darzustellen. ** ** **

Bisher haben wir erklärt, wie Informationen mithilfe einer Zwischentabelle in der Datenbank gespeichert werden. Von hier aus werden wir sehen, wie Assoziationen mithilfe von Zwischentabellen eingerichtet werden.

Um eine Zuordnung zu einer "Viele-zu-Viele" -Tabelle über eine Zwischentabelle herzustellen, müssen Sie die Option "Durch" in die bisher verwendete Methode "has_many" schreiben. Ich werde die Durchgangsoption als nächstes erklären.

durch Option

** Mit der Option through der Methode has_many wird eine Viele-zu-Viele-Zuordnung für das Modell definiert. ** ** ** Wie der Name ** durch bedeutet, bedeutet er "über". ** ** ** Ich werde ein Referenzbild verständlicher veröffentlichen.

参考.png

Wenn Sie die Option through verwenden, um eine Viele-zu-Viele-Zuordnung zu definieren, schreiben Sie für jedes Modell Folgendes.

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

Im Modell von zwei Tabellen in einer Viele-zu-Viele-Beziehung definiert die Methode has_many "Eins-zu-Viele" -Zuordnungen untereinander. Die Option through gibt die Zwischentabelle an, die durchlaufen werden soll.

Im Zwischentabellenmodell gibt die Methode includes_to zwei Tabellen an, die eine Viele-zu-Viele-Beziehung haben.

So definieren Sie eine "Viele-zu-Viele" -Verbindung.

Zusammenfassung

** - Verwenden Sie eine Zwischentabelle für "Viele-zu-Viele" -Zuordnungen -Im Modell von zwei Tabellen in einer "Viele-zu-Viele" -Beziehung wird die Methode has_many verwendet Zusammen mit der Definition der "Eins-zu-Viele" -Verbindungen des anderen, Verwenden Sie die Option through, um die Zwischentabelle anzugeben, die durchlaufen werden soll **

Wenn diese Erklärung zu lang und schwer zu verstehen ist, Entschuldigung. .. Ich habe mein Bestes getan, um es zusammenzustellen, also hoffe ich, dass es hilfreich ist. </ font>

das ist alles.