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.
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]
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.
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.
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.
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
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.
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].
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]
Recommended Posts