[RUBY] [Rails] Model Association (Vereinigung)

Ein Memorandum des (Assoziations-) Typs des Rails-Modells Referenz: Rails Guide https://railsguides.jp/association_basics.html

Gründe für die Assoziation

Die Verbindung zwischen zwei Active Record-Modellen wird als Zuordnung bezeichnet. Assoziationen werden im Folgenden einheitlich mit Assoziationen beschrieben. Der Grund für die Assoziation ・ Ermöglicht gemeinsame Operationen zwischen Modellen, wodurch das Schreiben von Code einfach und unkompliziert wird ・ Das Obige verbessert die Sichtbarkeit des Codes. Weil.

Example Am Beispiel einer einfachen Aufgabenverwaltungsanwendung schreiben wir die Zuordnung zwischen dem Benutzer (Benutzer) und der Aufgabe (Aufgabe). (Schreiben Sie entlang der Rails-Anleitung)

class User < ApplicationRecord
end

class Task < ApplicationRecord
end

Wenn der Benutzer den Fall des Hinzufügens einer neuen Aufgabe und den Fall des Löschens des Benutzers ohne Zuordnung beschreibt, lautet die Implementierung wie folgt.

#Neue Aufgabe hinzufügen
@task = Task.create(task: "Einkaufen", user_id: @user.id)

#Benutzer löschen(In diesem Fall bleiben bedeutungslose Daten für immer in der Datenbank, wenn Sie nicht alle Aufgaben des zu löschenden Benutzers zusammen löschen.)
@tasks = Task.where(user_id: @user.id)
@tasks.each do |task|
  task.destroy
end
@user.destroy

Durch explizites Hinzufügen von Assoziationen zum Rails-Modell können Sie Ihren Code präziser schreiben. Definieren Sie zunächst die Modellzuordnung.

class User < ApplicationRecord
 #Der Benutzer hat mehrere Aufgaben,Definiert, dass beim Löschen eines Benutzers auch alle Aufgaben gelöscht werden
  has_many :tasks, dependent: :destroy
end

class Task < ApplicationRecord
 #Aufgaben werden von einem Benutzer erstellt
  belong_to :user
end

Damit ist die Zuordnung abgeschlossen. Wenn Sie has_many erklären und dazu ziemlich grob gehören

Aus Sicht des Benutzers kann es mehrere Aufgaben haben, wie z. B. Task_a, Task_b, Task_c, Von Task aus gesehen gibt es nur einen Benutzer Ich habe es in Rails als eine Eins (Benutzer) zu vielen (Aufgaben) Beziehung definiert.

Die abhängige :: destroy-Option ist übrigens Wenn ein Benutzer gelöscht wird, bedeutet dies, dass alle Aufgaben dieses Benutzers gelöscht werden sollten.

Indem Sie die Assoziation wie oben herstellen, Das Hinzufügen neuer Aufgaben und das Löschen von Benutzern kann nun kurz wie folgt beschrieben werden.

#Neue Aufgabe hinzufügen
@task = @user.tasks.create(task: "Einkaufen")

#Benutzer löschen(dependent: :Die Zerstörungsoption löscht auch die Aufgabe des Benutzers.)
@user.destroy

Insbesondere benötigt der gelöschte Teil nur eine Zeile für fünf Zeilen. Wenn ich mir den Code anschaute, konnte ich sofort verstehen, was ich tat, und die Aussichten verbesserten sich.

Assoziationstyp

belongs_to has_one has_many has_many :through has_one :through has_and_belongs_to_many

Erläuterung

belong_to Eine Eins-zu-Eins-Zuordnung wird festgelegt. Alle Instanzen des deklarierenden Modells "gehören" zur Instanz des anderen Modells. Am Beispiel des Beispielkapitels wird die Beziehung zum Zuweisen eines Benutzers zu einer Aufgabe ausgedrückt. Der in der Zugehörigkeit zu_to angegebene Modellname muss immer "Einzelform" sein.

 #Da es nur einen Benutzer gibt, muss dieser singulär sein.
 #Das automatische Erraten von Schienen führt zu einem Fehler.
class Task < ApplicationRecord
  belong_to :user
end

has_one Eine Eins-zu-Eins-Zuordnung wird festgelegt. Der Unterschied zu gehör_zu ist Gibt an, dass die deklarierte Modellinstanz eine Instanz des anderen Modells "enthält" oder "besitzt". Nehmen Sie als Beispiel die nationale Krankenversicherungsbescheinigung (schwer zu verstehen (lacht)?)

Eine Person besitzt eine Versicherungspolice.
class people < ApplicationRecord
  has_one :insurance_card
end

Eine Person hat eine Versicherungspolice.
class insurance_card < ApplicationRecord
  belong_to :people
end

has_many Zeigt an, dass eine "Eins-zu-Viele" -Verbindung besteht. Wenn die Zuordnung has_many verwendet wird, besitzt eine Instanz dieses Modells "null oder mehr" Instanzen des entgegengesetzten Modells. Am Beispiel des Beispielkapitels ist es möglich, eine Beziehung auszudrücken, in der ein Benutzer mehrere Aufgaben hat. Wenn Sie eine has_many-Zuordnung deklarieren, muss der Modellname der anderen Partei "Plural" sein.

 #Da mehrere Aufgaben einem Benutzer gehören können, müssen sie im Plural beschrieben werden.
 #Das automatische Erraten von Schienen führt zu einem Fehler.
class User < ApplicationRecord
  has_many :tasks
end

has_many :through Wird häufig zum Einrichten von "Viele-zu-Viele" -Verbindungen verwendet. Diese Zuordnung erstellt ein "drittes Modell (Zwischenmodell)" zwischen den beiden Modellen. Infolgedessen stimmt es mit "0 oder mehr" Instanzen des gegnerischen Modells überein. Es ist möglich, die Schüler, die eine bestimmte Klasse besuchen, auf mehrere Klassen und mehrere Schüler zu beschränken.

Die Schüler nehmen mehrere Lektionen.
class Student < ApplicationRecord
  has_many :members
  has_many :class_works, through: :members
end

Durch Speichern der IDs mehrerer Klassen und mehrerer Schüler ist es möglich, die Schüler einer bestimmten Klasse einzuschränken.
class Member < ApplicationRecord
  belongs_to :student
  belongs_to :class_work
end

Die Klasse wird von mehreren Schülern besucht.
class Class_work < ApplicationRecord
  has_many :members
  has_many :students, through: :members
end

has_one :through Stellen Sie eine "Eins-zu-Eins" -Verbindung ein. Diese Zuordnung erstellt ein "drittes Modell (Zwischenmodell)" zwischen den beiden Modellen. Es entspricht einer Instanz des anderen Modells. Ich kann mir das nicht vorstellen, also nehme ich den Rails-Leitfaden als Beispiel.

Wenn ein Anbieter einem Konto und ein Konto einem Kontoverlauf zugeordnet ist, sieht das Lieferantenmodell folgendermaßen aus:

#Der Lieferant hat ein Konto und ein Konto über das Konto_Habe Geschichte.
class Supplier < ApplicationRecord
  has_one :account
  has_one :account_history, through: :account
end

#Konto gehört Lieferant und Konto_Habe eine Geschichte
class Account < ApplicationRecord
  belongs_to :supplier
  has_one :account_history
end

#Der Kontoverlauf gehört zu accout
class AccountHistory < ApplicationRecord
  belongs_to :account
end

has_and_belongs_to_many Erstellen Sie eine "Viele-zu-Viele" -Verbindung. Im Gegensatz zu dem Fall, in dem through: angegeben ist, gibt es jedoch kein drittes Modell (Zwischenmodell). Wenn es eine Baugruppe und ein Teil gibt und ein fertiges Auto vielen Teilen entspricht und umgekehrt ein Teil auch vielen fertigen Autos entspricht, lautet die Modelldeklaration wie folgt. Wird sein.

#Das fertige Auto hat viele Teile(parts)Ist angebracht und wird ein Auto.
class Assembly < ApplicationRecord
  has_and_belongs_to_many :parts
end

#Es gibt mehrere Teile, die an mehreren fertigen Fahrzeugen angebracht sind.
class Part < ApplicationRecord
  has_and_belongs_to_many :assemblies
end

Recommended Posts

[Rails] Model Association (Vereinigung)
Modellassoziation in Rails
Ruby On Rails Association
Schienen g Modell Gesamtdurchfluss
Informationen zum Benennen von Rails-Modellmethoden
Namenskonventionen für Schienenmodelle und Tabellen
[Schienen g. Fehler]
Verein (viele zu viele)! !!
Rails Grundlagen
Rails Review 1
Rails API
Schienenmigration
[Rails] Unit-Testcode für das Benutzermodell
[Rails] first_or_initialize
Schienen Tutry
[Ruby on Rails] 1 Modell CRUD (Routing Main)
Verein (eins zu viele)! !!
Über Schienen 6
Modell [Ruby on Rails], Befehl für Controller-Terminal
Befehl zum Erstellen / Löschen von Ruby on Rails-Modellen
Schienenfundament
Rails Memorandum
Schienen Tutorial
Deshalb habe ich dieses Mal die Methode "Verknüpfen des Inhalts des Verzeichnisses" übernommen. Ich denke, es wird je nach Zeit und Fall richtig verwendet. Tutorial zu Linux, ln, Linux-Befehlsschienen
MVC-Modell
Rails Association hat eine Eins-zu-Viele-Beziehung zwischen Modellen
Verein (1 zu 1)! !!
[Schienen] erfinden
[Ruby on Rails] Modelltest mit RSpec
Schienen Tutry
Schienen Tutorial
Schienen Tipps
Schienenmethode
Schienen Tutorial
Rails Review 2
Holen Sie sich ein untergeordnetes Modell mit Schienen created_at desc scope
Erstellen Sie eine EC-Site mit Rails5 ⑤ ~ Kundenmodell ~