Ruby on Rails6 Praktischer Leitfaden [Erweiterungen] cp3 ~ cp6 [Memo]

Einführung

Der Autor dieses Artikels ist ein Anfänger, der gerade erst anfängt, Programmieren zu lernen. Ich würde mich freuen, wenn Sie auf Fehler hinweisen könnten.

Überblick

Dieser Artikel ist eine persönliche Notiz von dem, was ich durch Lesen des Ruby on Rails 6 Practical Guide gelernt habe. Es scheint schwer zu lesen zu sein, da es auszugsweise und aufgegriffen ist. Entschuldigung. Dieses Buch hat auch eine Fortsetzung Erweiterung, und beide wurden zum Zeitpunkt des Schreibens des Artikels untersucht. Ich werde auch einen Artikel zur Überprüfung schreiben. Ich werde cp1 und cp2 der Funktionserweiterung überspringen, weil sie die Umgebungskonstruktion und den Code des Hauptteils erklären.

Vorheriger Artikel Ruby on Rails6 - Praktischer Leitfaden cp4 ~ cp6 [Memo] Ruby on Rails6 - Praktischer Leitfaden cp7 ~ cp9 [Memo] Ruby on Rails6 - Praktischer Leitfaden cp10 ~ cp12 [Memo] Ruby on Rails6 - Praktischer Leitfaden cp13 ~ cp15 [Memo] Ruby on Rails6 - Praktischer Leitfaden cp16 ~ cp18 [Memo]

Funktionserweiterung Kapitel 3 Suchformular

Name des Index

Die Methode add_index generiert standardmäßig einen Namen wie folgt:

Der Name des Index ist jedoch begrenzt. Wenn Sie also eine große Anzahl von Spalten als zusammengesetzten Index kombinieren, können Sie die Grenze überschreiten. In solchen Fällen müssen Sie den Indexnamen mit der Option name angeben.

add_index :customers, [ :birth_year, :family_name_kana, :given_name_kana ],
  name: "index_customers_on_birth_year_and_furigana"

Composite-Index

Wenn für die Spalten X, Y und Z ein zusammengesetzter Index festgelegt ist, wird dieser zusammengesetzte Index nur für die Suche nach Spalte X, für Suchvorgänge mit den Spalten X und Y und für Suchvorgänge mit drei Spalten verwendet. Dieser zusammengesetzte Index wird jedoch nicht für eine Suche nach Spalte Y allein, eine Suche nach Spalte Z allein oder eine Suche nach einer Kombination von Spalten Y und Z verwendet. Um die Suche für alle Kombinationen zu optimieren, müssen Sie den Index wie folgt einstellen.


Unterschied zwischen &. (Bocchi-Operator) und Try-Methode

Beide Methoden geben null zurück, wenn der Empfänger null ist, aber das Verhalten unterscheidet sich geringfügig, wenn der Empfänger nicht null ist. Wenn Sie versuchen, eine Methode aufzurufen, die im Empfänger nicht mit & definiert ist, tritt NoMethodError auf. Wenn dies jedoch versucht wird, wird nil zurückgegeben.

user&.name
user.try(:name)

Wenn im obigen Beispiel die Instanzmethode des Benutzers keinen Namen hat, tritt NoMethodError nur auf, wenn &. Verwendet wird.


Beziehungsobjekte akkumulieren

attr_accessor :name, :gender, :birthday

def search
  rel = User

  rel = rel.where(name: name) if name.present?
  rel = rel.where(gender: gender) if gender.present?
  rel = rel.where(birthday: birthday) if birthday.present?
  rel = rel.order(:name)
end

Der obige Code ist ein Formularobjekt. Definiert ein Suchobjekt, das Suchergebnisse zurückgibt. Da where und order ein Relation-Objekt zurückgeben, können Sie verschiedene Suchbedingungen im Relation-Objekt wie im obigen Code speichern.

Tabellen mit Joins verbinden

rel = rel.joins(:articles)
rel = rel.where("articles.title" => title) if title.present?

Die Joins-Methode führt einen Tabellen-Join </ strong> durch. Mit Tabellenverknüpfungen können Sie Datensätze basierend auf Spaltenwerten in anderen Tabellen filtern. Das Argument der Joins-Methode ist der Name der Zuordnung. Diese Methode gibt auch ein Relation-Objekt zurück. Wenn Sie einer Tabelle beitreten, können Sie nach anderen Tabellen wie dem Code in der zweiten Zeile suchen.

Entfernen Sie Duplikate

rel = rel.distinct

Sie können Duplikate aus den Suchergebnissen entfernen, indem Sie die eindeutige Methode aufrufen.

Funktionserweiterung Kapitel 4 Beim nächsten Mal automatisch anmelden

cookies

cookies.signed[:user_id] = user.id

Durch Aufrufen der signierten Methode wird der Cookie-Wert unlesbar und unveränderlich.

cookies.permanent.signed[:user_id] = user.id

Die permanente Methode legt das Ablaufdatum des Cookies nach 20 Jahren fest.

cookies.delete(:user_id)

Sie können die im Cookie aufgezeichnete ID mit dem obigen Code löschen.


Cookie-Test

expect(response.cookies).to have_key("customer_id")
expect(response.cookies["customer_id"]).to match(/[0-9a-f]{40}\z/)

In der ersten Zeile wird geprüft, ob das Cookie einen Schlüssel namens "customer_id" enthält. In der zweiten Zeile wird geprüft, ob der Cookie-Wert deaktiviert ist. Nicht sichtbare Cookies haben die Eigenschaft, am Ende eine 40-stellige Hexadezimalzahl zu haben. Daher untersuchen wir dies mithilfe regulärer Ausdrücke.

Funktionserweiterung Kapitel 5 Zugriffsbeschränkungen nach IP-Adresse

Stellen Sie sicher, dass der Wert numerisch ist

validates :octet1, numericality: { only_integer: true },
  inclusion: { in: 0..255 }

Die Numerizität überprüft, ob der Wert nur eine Zahl ist. Wenn Sie für only_integer true angeben, werden nur Ganzzahlen abgeglichen. Allein mit Einbeziehung wird eine Zeichenfolge wie "XYZ" in die Ganzzahl 0 geändert, sodass kein Fehler auftritt. Die Numerizität führt zu einem Fehler, da der Wert vor der Konvertierung überprüft wird.

Rails Guide enthält weitere Details.

Funktionserweiterung Kapitel 6 Viele-zu-Viele-Assoziationen

Viele-zu-viele-Assoziationen können mithilfe einer Verknüpfungstabelle in eine Kombination aus zwei Eins-zu-viele-Assoziationen unterteilt werden.


Fügen Sie der Zahl ein dreistelliges Komma hinzu

number_with_delimiter(100000)

100.000 werden zurückgegeben.


Zählen Sie die Anzahl der vielen zu vielen Assoziationen

Wenn ein Kunde und ein Programm eine Viele-zu-Viele-Beziehung haben,

program.cusotmers.count

Sie können die Anzahl der Programmteilnehmer wie folgt zählen. Die Leistung wird jedoch schlechter, da eine komplizierte Abfrage mit JOIN ausgegeben wird.

Dies ist auch dann der Fall, wenn Sie die Verknüpfungstabellenanwendungen (Einträge) zählen, sodass Sie auch wie folgt schreiben können.

program.entries.count

Durch Zählen der Anzahl der verknüpften Tabellen wird die Ausgabe komplexer Abfragen verhindert und die Leistung verbessert.

Lösen Sie das N + 1-Problem

Mit dem obigen Code wird die Anzahl der Bewerber für jedes Programm gezählt, sodass ein "N + 1-Problem" vorliegt. Mit dem folgenden Code können Sie die Anzahl der Bewerber für jedes Programm mit einer einzigen Abfrage ermitteln.

Program.joins(:entries)
  .select("programs.*, COUNT(entries.id) AS number_of_applicants")
  .group("programs.id")

Geben Sie den Namen der Zuordnung im Argument joins an. Es ist kein Tabellenname. Geben Sie im Argument der Methode select die Spalte an, um den Wert aus der Tabelle abzurufen. Die SQL-Funktion COUNT gibt die Anzahl der Datensätze zurück, in denen der im Argument angegebene Spaltenwert nicht NULL ist. Da AS den Wert auf der linken Seite benennt, können Sie die Anzahl der Datensätze in der Eintragstabelle als Spalte mit der Bezeichnung number_of_applicants abrufen. Die Gruppenmethode unterteilt Datensätze basierend auf der im Argument angegebenen Spalte in Gruppen. Wenn eine Aggregatfunktion wie COUNT zur Auswahl angegeben wird, ist im Prinzip ein Aufruf erforderlich. Durch Aufteilen in Gruppen können Sie die Anzahl der Einträge für jede program_id ermitteln.

program[:number_of_applicants]

Sie können sich wie oben darauf beziehen.

Linke äußere Verbindung der Tabelle

Wenn Sie Tabellen normalerweise mit der Joins-Methode verknüpfen, werden Datensätze, auf die in der verknüpften Tabelle überhaupt nicht verwiesen wird, aus den Suchergebnissen ausgeschlossen. Mit anderen Worten, es werden nur Programme durchsucht, für die ein oder mehrere Anträge eingereicht wurden.

left_joins(:entries)

Wenn Sie Verknüpfungen mit left_joins neu schreiben, bleiben nicht referenzierte Datensätze erhalten.

Fortsetzung

Wir werden die URLs der folgenden Artikel einzeln hinzufügen.

Ruby on Rails6 - Praktischer Leitfaden [Erweiterungen] cp7 ~ cp9 [Memo] Ruby on Rails6 - Praktischer Leitfaden [Erweiterungen] cp10 ~ cp12 [Memo]

Quelle zitieren

Recommended Posts

Ruby on Rails6 Praktischer Leitfaden [Erweiterungen] cp7 ~ cp9 [Memo]
Ruby on Rails6 Praktischer Leitfaden [Erweiterungen] cp10 ~ cp12 [Memo]
Ruby on Rails6 Praktischer Leitfaden [Erweiterungen] cp3 ~ cp6 [Memo]
Ruby on Rails6 Praktischer Leitfaden cp13 ~ cp15 [Memo]
Ruby on Rails6 Praktischer Leitfaden cp7 ~ cp9 [Memo]
Ruby on Rails6 Praktischer Leitfaden cp4 ~ cp6 [Memo]
Ruby on Rails6 Praktischer Leitfaden cp10 ~ cp12 [Memo]
Ruby on Rails6 Praktischer Leitfaden cp16 ~ cp18 [Memo]
Ruby on Rails 6.0-Umgebungskonstruktionsnotiz
[Ruby on Rails] Select2-Einführungsnotiz für Webpacker
[Persönliches Memo] Ruby on Rails-Umgebungskonstruktion (Windows)
Ruby on Rails Elementary
Ruby on Rails Grundlagen
Ruby On Rails Association
Ruby on Rails5 - Schnellübungshandbuch 5.2 Kompatibel Kapitel2
Ruby on Rails5 - Schnellübungshandbuch 5.2 Kompatibel Kapitel3
Ruby on Rails Lernrekord -2020.10.03
Portfolioerstellung Ruby on Rails
Ruby on Rails Lernrekord -2020.10.04
[Ruby on Rails] Debuck (bindend.pry)
Ruby on Rails Lernrekord -2020.10.05
Ruby on Rails Lernrekord -2020.10.09
Ruby on Rails lernen Rekord-2020.10.07 ②
Ruby on Rails lernen Rekord-2020.10.07 ①
Brechen Sie die Ruby on Rails-Migration ab
Ruby on Rails Lernrekord -2020.10.06
Zusammenfassung der Ruby on Rails-Validierung
Ruby on Rails Grundlegendes Memorandum
[Ruby on Rails] Leseversuch (: [],: Schlüssel)
Ruby on Rails-Variablen, konstante Zusammenfassung
Installation von Ruby + Rails unter Ubuntu 18.04 (rbenv)
[Ruby on Rails] Paging-Funktion eingeführt
Grundkenntnisse in Ruby on Rails
Progate Ruby on Rails5 Rückblick
Verwendung von Ruby on Rails
Ruby on Rails Japanisch-Englisch kompatibler i18n
(Ruby on Rails6) Gepostete Inhalte "löschen"
[Ruby on Rails] CSV-Ausgabefunktion
[Ruby on Rails] Erstellung der Bestätigungsseite
Ruby On Rails entwickelt Routing-Konflikte
[Ruby on Rails] Implementierung der Kommentarfunktion
[Ruby on Rails] DM, Chat-Funktion
[Ruby on Rails] Praktische Hilfsmethode
[Ruby on Rails] Stoppen Sie "Looping bis ..."
[Ruby on Rails] Suchfunktion (nicht ausgewählt)
[Rails] Hinzufügen der Ruby On Rails-Kommentarfunktion
[Ruby on Rails] Erstellen eines Anfrageformulars
[Ruby on Rails] Test mit RSpec anzeigen
[Ruby on Rails] Codeprüfung mit Rubocop-Airbnb
[Ruby on Rails] 1 Modell CRUD (Routing Main)
Ruby on Rails-Installationsmethode [Mac Edition]
Modell [Ruby on Rails], Befehl für Controller-Terminal