[RUBY] [Rails] Unterschied im Verhalten zwischen Delegat und has_many-through bei Eins-zu-Eins-zu-Viele

Angenommen, Sie haben ein Eins-zu-Viele-Beziehungsmodell, wie unten gezeigt.

class User
  has_one :examinee
end

class Examinee
  belongs_to :user
  has_many :tests
end

class Test
  belongs_to :examinee
end

Wie implementieren Sie es, wenn Sie das relevante Testmodell aus dem Benutzermodell erhalten möchten?

Es gibt verschiedene Möglichkeiten, dies zu tun, aber ich denke, Sie verwenden häufig die praktische Funktion "Delegieren" von ActiveRecord oder "has_many-through". Beide können erreichen, was Sie tun möchten, aber die ausgegebenen Abfragen unterscheiden sich geringfügig, sodass ich sie vorstellen werde.

delegate

Mit delegate können Sie eine Methode an eine andere Klasse delegieren. Weitere Informationen finden Sie im Rails Guide. 3.4.1 delegate

In diesem Fall implementieren Sie wie folgt.

app/models/user.rb


delegate :tests, to: :examinee

Bei der Ausführung werden zwei Abfragen ausgegeben, wie unten gezeigt. Rufen Sie zuerst den Prüfling des Delegierungsziels ab (erste Abfrage) und führen Sie dann Prüflingstests aus (zweite Abfrage).

irb> user.tests
Examinee Load SELECT `examinees`.* FROM `examinees` WHERE `examinees`.`user_id` = 1 LIMIT 1
Test Load SELECT `tests`.* FROM `tests` WHERE `tests`.`examinee_id` = 1

has_many-through

has_many-through wird häufig in vielen zu vielen Fällen verwendet, kann aber auch in Eins-zu-vielen-Fällen wie diesem verwendet werden.

Weitere Informationen finden Sie im Rails Guide. 2.4 has_many: durch Assoziation

In diesem Fall implementieren Sie wie folgt.

app/models/user.rb


has_many :tests, through: :examinee

Bei der Ausführung wird eine Abfrage wie unten gezeigt ausgegeben. In diesem Fall wird nur eine verknüpfte Abfrage ausgegeben. Wenn man bedenkt, dass diese Funktion so implementiert ist, dass sie vielen zu vielen entspricht, kann man verstehen, dass sie durch Join erfasst wird, da sie in zwei Schritten wie Deletgate nicht effizient erfasst werden kann.

irb> user.tests
Test Load SELECT `tests`.* FROM `tests` INNER JOIN `examinees` ON `tests`.`examinee_id` = `examinees`.`id` WHERE `examinees`.`user_id` = 1

Schließlich

Ob es besser ist, zwei Abfragen oder eine Abfrage zu verknüpfen, hängt von der Ausführungsumgebung ab. Daher kann nicht beurteilt werden, ob es gut oder schlecht ist. In den meisten Fällen spielt es keine Rolle, welche Sie schreiben, also spielt es keine Rolle, welche Sie schreiben.

Selbst wenn es aus Black-Box-Sicht so aussieht, als würde es dasselbe tun, können die intern ausgegebenen Abfragen wie diesmal unterschiedlich sein. Gelegentlich wäre es interessant, diese kleinen Unterschiede zu überprüfen, wenn man den Ursprung und den Zweck der Funktion betrachtet.

Recommended Posts

[Rails] Unterschied im Verhalten zwischen Delegat und has_many-through bei Eins-zu-Eins-zu-Viele
[Rails / Active Record] Über den Unterschied zwischen create und create!
Unterschied zwischen Mitglied und Sammlung von Schienen route.rb
[Rails] Ich habe den Unterschied zwischen Ressourcen und Ressourcen untersucht
Unterschiede zwischen Klassen und Instanzen in Ruby
[Rails] Was ist der Unterschied zwischen Redirect und Rendering?
Verstehe in 3 Minuten! Eine sehr grobe Erklärung des Unterschieds zwischen Sitzung und Cookie
[Rails] Was ist der Unterschied zwischen Bundle-Installation und Bundle-Update?
Was ist der Unterschied zwischen den Verantwortlichkeiten der Domänenschicht und der Anwendungsschicht in der Zwiebelarchitektur [DDD]?
[Rails] Unterschied zwischen find und find_by
[Rails] Unterschied zwischen redirect_to und Rendern
Geben Sie die Differenz zwischen jedem Feld zweier Objekte in Java aus
Unterschied zwischen UI-Beschriftung durch Char Wrapping und Word Wrapping in der japanischen Anzeige
Unterschied zwischen final und Immutable in Java
Die Identität der Schienenparameter [: id]
Unterschied zwischen pop () und peek () im Stapel
Unterschied zwischen isEmpty und isBlank von StringUtils
Unterschied zwischen getText () und getAttribute () von Selen
Über den Unterschied zwischen irb und pry
Unterschied zwischen "|| =" und "instance_variable_defined?" Im Ruby-Memo
Unterschied zwischen EMPTY_ELEMENTDATA und DEFAULTCAPACITY_EMPTY_ELEMENTDATA in ArrayList
Unterschied zwischen int und Integer in Java
[Rails] Unterschied zwischen redirect_to und render [Anfänger]
[Rails] Ich habe den Unterschied zwischen neuer Methode, Speichermethode, Erstellungsmethode und Erstellungsmethode untersucht.
Zeigen Sie die dreidimensionale Struktur von DNA und Protein in Ruby-im Fall von GR.rb an
Verstehen Sie den Unterschied zwischen int und Integer und BigInteger in Java und float und double
[Java] Verstehe den Unterschied zwischen List und Set
[Bestellmethode] Legen Sie die Reihenfolge der Daten in Rails fest
[iOS] Verstehe den Unterschied zwischen Frame und Grenzen
Unterschied zwischen next () und nextLine () in Java Scanner
Verstehe den Unterschied zwischen abstrakten Klassen und Schnittstellen!
Was ist der Unterschied zwischen SimpleDateFormat und DateTimeFormatter? ??
[Schienen] Unterschied zwischen Erstellungsmethode und neuer + Speichermethode
[Rails] Rangfolge und Paginierung in der Reihenfolge der Likes
Gibt es Ende 2017 einen Leistungsunterschied zwischen Oracle JDK und OpenJDK?
Überprüfen Sie das Verhalten von getOne-, findById- und Abfragemethoden mit Spring Boot + Spring Data JPA
Zusammenfassung der häufig verwendeten Befehle in Rails und Docker
[Ruby] Ich habe über den Unterschied zwischen each_with_index und each.with_index nachgedacht
[Für Anfänger] DI ~ Die Grundlagen von DI und DI im Frühjahr ~
Was ist der Unterschied zwischen Systemspezifikation und Funktionsspezifikation?
Rufen Sie den Namen des Testfalls in der JUnit-Testklasse ab
In Bezug auf den Unterschied zwischen den drei Timeouts in HttpClient von Java
Unterschied zwischen neu und in Rais Action Controller erstellen
Berechnen Sie die Differenz zwischen Zahlen in einem Ruby-Array
[Java] Unterschied zwischen statischem final und final in Mitgliedsvariablen
Das Verhalten unterscheidet sich zwischen new und clear () von ArrayList
Vergleichen Sie den Unterschied zwischen Docker-Datei vor und nach Docker-Slim
[JAVA] Was ist der Unterschied zwischen Schnittstelle und Zusammenfassung? ?? ??
Überprüfung der Beziehung zwischen dem Docker-Image und dem Container
Was ist der Unterschied zwischen Überspringen und Ausstehend? [RSpec]
SSL in der lokalen Umgebung von Docker / Rails / Puma