Ruby on Rails6 Praktischer Leitfaden cp16 ~ cp18 [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. Da es in 18 Kapitel unterteilt ist, werden wir es nach Überschriften unterteilen.

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]

Kapitel 16 Vererbung einzelner Tabellen

Einzeltabellenvererbung </ strong> ist eine Pseudoimplementierung des objektorientierten Programmiervererbungskonzepts in einer relationalen Datenbank.

Mit der Vererbung einzelner Tabellen können Sie mehrere Arten ähnlicher Objekte zusammen in einer einzigen Tabelle aufzeichnen.

Wenn Sie eine Tabelle mit dem Namen address mit einer Spalte vom Typ string und einer Spalte postal_code haben, können Sie die Vererbung einzelner Tabellen ausdrücken, indem Sie Folgendes definieren:

class Address < ApplicationRecord
end

class HomeAddress < Address
end

class WorkAddress < Address
end

HomeAddress und WorkAddress erben von der Address-Klasse. Zu diesem Zeitpunkt können Sie die Objekte HomeAddress und WorkAddress wie folgt in der Datenbank speichern.

HomeAddress.create(postal_code: "1000001")
WorkAddress.create(postal_code: "1000002")

Diese Informationen werden in der Adresstabelle aufgezeichnet, wie in der folgenden Tabelle gezeigt.

id type postal_code
1 HomeAddress 1000001
2 WorkAddress 1000002

Rails legt den Wert automatisch in der Typenspalte fest.

Der Code zum Abrufen der HomeAddress- und WorkAddress-Objekte aus der Datenbank sieht außerdem folgendermaßen aus:

a1 = HomeAddress.find(1)
a2 = WorkAddress.find(2)

Der ID-Wert muss dem Klassennamen in der Typspalte entsprechen.


fields_for

= form_with model: @customer_form do |f|
  = f.fields_for :customer, f.object.customer do |ff|
  -#Kürzung

Mit der Instanzmethode fields_for des Formularerstellers können Sie das Zielobjekt des Formulars wechseln. Sie können mehrere Modellobjektformulare mit demselben Formular generieren. Das erste Argument ist der Datensatzname und das zweite Argument ist das Zielobjekt.


Zeitpunkt des Speicherns zugehöriger Objekte

Wenn das Cusotmer-Objekt einem HomeAddress- und einem WorkAddress-Objekt zugeordnet ist

customer.save
customer.home_address.save
customer.work_address.save

Durch das Speichern eines Cusotmer-Objekts wird das HomeAddress-Objekt nicht automatisch gespeichert.

Wenn das Cusomer-Objekt jedoch nicht in der Datenbank gespeichert ist, werden auch die HomeAddress- und WorkAddress-Objekte automatisch gespeichert.

transaction

ActiveRecord::Base.transaction do
  customer.save!
  customer.home_address.save!
  customer.work_address.save!
end

Dieser Bereich der Datenbankverarbeitung ist im Block ActiveRecord :: Base.transaction enthalten und wird als Transaktion ausgeführt.

Chapter 17 Capybara

let!

let(:staff_member) { create(:staff_member) }
let!(:staff_member) { create(:staff_member) }

Die let-Methode erstellt und speichert ein Objekt beim ersten Aufruf und gibt beim zweiten Mal dasselbe Ergebnis zurück. Die let! -Methode unterscheidet sich darin, dass sie zur Definitionszeit ein Objekt erstellt.


inclusion

validates :gender, inclusion: { in: %w(male female), allow_blank: true }

Durch die Aufnahme wird sichergestellt, dass sich der Wert in einer bestimmten Liste befindet.


Überprüfen Sie mehrere Objekte gleichzeitig

def valid?
  customer.valid? && customer.home_address.valid?
    && customer.work_address.valid?
end

Wenn Sie mehrere Objekte in einem Formular bearbeiten, führt die Überprüfung der Validierung wie oben zu Problemen. Wenn das Kundenobjekt die Validierung nicht besteht, wird an diesem Punkt false zurückgegeben, sodass die Validierung von home_address und work_address nicht überprüft wird. Infolgedessen kann der Fehler nicht im Formular angezeigt werden.

def valid?
  [ customer, customer.home_address, customer.work_address ]
    .map(&:valid?).all?
end

Wenn Sie ein Objekt in ein Array verwandeln und einen gültigen Aufruf für jede verwendete Karte aufrufen, wird das Ergebnis als Array zurückgegeben. Die all? -Methode ist eine Methode, die überprüft, ob alle Elemente des Arrays wahr sind. Sie können jetzt Validierungsprüfungen für alle Objekte durchführen.


autosave

class Customer < ApplicationRecord
  has_one :home_address, dependent: :destroy, autosave: true
  has_one :work_address, dependent: :destroy, autosave: true
end

Wenn Sie für die Option zum automatischen Speichern true angeben, wird das zugehörige Objekt ebenfalls automatisch gespeichert.


Teilen Sie Normalisierung und Validierung

Sie können Ihren Code für ActiveSupport :: Concern freigeben. ActiveSupport :: Concern ist auch in Artikel im vorherigen Kapitel geschrieben.

app/models/concerns/email_holder.rb


class EmailHolder
  extend ActiveSupport::Concern

  included do
    include StringNormalizer
     
     before_validation do
       self.email = normalize_as_email(email)
     end

     validates :email, presence: true, "valid_email_2/email": true,
        uniqueness: { case_sensitive: true }
  end
end

StringNormalizer ist ein Modul zur Normalisierung, das im vorherigen Kapitel erstellt wurde. valid_email_2 / email ist ein Juwel, das die Validierung Ihrer E-Mail-Adresse hinzufügt.

#In das von Ihnen verwendete Modell aufnehmen
include EmailHolder

Kapitel 18 Formularobjekte

mark_for_destruction

customer.home_address.mark_for_destruction

Durch Aufrufen der Methode mark_for_destruction für das zugehörige Modellobjekt wird es zum Löschen markiert. Das Löschziel wird gelöscht, wenn das übergeordnete Ziel in der Datenbank gespeichert wird. Im obigen Beispiel ist das Löschziel home_address und das übergeordnete Ziel ist customer. Damit dieser Mechanismus funktioniert, müssen Sie für die zugehörige Option zum automatischen Speichern true angeben.


Umfang der Vereinigung

has_many :personal_phones, -> { where(address_id: nil).order(:id) },
  class_name: "Phone", autosave: true

Sie können den Umfang der Zuordnung angeben, indem Sie ein Proc-Objekt als zweites Argument von has_many angeben.


index

= form_with model: @customer_form, scope: "form" do |f|
  = customer.perdonal_phones.each_with_index do |phone, index|
    = f.fields_for :phones, phone, index: index do |ff|
      = f.text_field :number

Wenn Sie mehrere Formulare desselben Objekts erstellen, können Sie diese mit der Indexoption identifizieren. Durch Hinzufügen der Indexoption ändert sich das Namensattribut des Eingabeelements. Im obigen Beispiel wäre es Form [Kunde] [Telefon] [0] [Nummer].

Fortsetzung

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

Ruby on Rails6 - Praktischer Leitfaden [Erweiterungen] cp3 ~ cp6 [Memo] Ruby on Rails6 - Praktisches Handbuch [Funktionserweiterung] cp7 ~ cp9 [Memo] Ruby on Rails6 - Praktischer Leitfaden [Erweiterungen] cp10 ~ cp12 [Memo]

Quelle zitieren

Recommended Posts

Ruby on Rails6 Praktischer Leitfaden cp13 ~ cp15 [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 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 Rails Elementary
Ruby On Rails Association
[Ruby on Rails] Select2-Einführungsnotiz für Webpacker
[Persönliches Memo] Ruby on Rails-Umgebungskonstruktion (Windows)
Ruby on Rails Lernrekord -2020.10.03
Portfolioerstellung Ruby on Rails
Ruby on Rails Lernrekord -2020.10.04
Ruby on Rails5 - Schnellübungshandbuch 5.2 Kompatibel Kapitel2
[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 Rails5 - Schnellübungshandbuch 5.2 Kompatibel Kapitel3
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
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] Einführung der Anfangsdaten
[Ruby on Rails] Suchfunktion (nicht ausgewählt)
[Rails] Hinzufügen der Ruby On Rails-Kommentarfunktion
[Ruby on Rails] Erstellen eines Anfrageformulars
[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
Befehl zum Erstellen / Löschen von Ruby on Rails-Modellen