L'auteur de cet article est un débutant qui commence à peine à apprendre la programmation. Je vous serais reconnaissant de bien vouloir signaler les erreurs.
Cet article est un mémo personnel de ce que j'ai appris en lisant le Guide pratique de Ruby on Rails 6. Il semble difficile à lire car il est extrait et repris. Excusez-moi. Ce livre a également une suite Extension, et les deux ont été étudiés au stade de la rédaction de l'article. J'écrirai également un article pour examen. Puisqu'il est divisé en 18 chapitres, nous le diviserons par titre.
Article précédent Guide pratique Ruby on Rails6 cp4 ~ cp6 [Memo] Guide pratique Ruby on Rails6 cp7 ~ cp9 [Memo] Guide pratique Ruby on Rails6 cp10 ~ cp12 [Memo] Guide pratique Ruby on Rails6 cp13 ~ cp15 [Memo]
L'héritage de table unique </ strong> est une pseudo-réalisation du concept d'héritage de programmation orienté objet dans une base de données relationnelle.
L'héritage de table unique vous permet d'enregistrer plusieurs types d'objets similaires ensemble dans une seule table.
Si vous avez une table appelée adresse avec une colonne de type chaîne et une colonne postal_code, vous pouvez exprimer l'héritage de table unique en définissant:
class Address < ApplicationRecord
end
class HomeAddress < Address
end
class WorkAddress < Address
end
HomeAddress et WorkAddress héritent de la classe Address. À ce stade, vous pouvez enregistrer les objets HomeAddress et WorkAddress dans la base de données comme suit.
HomeAddress.create(postal_code: "1000001")
WorkAddress.create(postal_code: "1000002")
Ces informations sont enregistrées dans le tableau des adresses comme indiqué dans le tableau ci-dessous.
id | type | postal_code |
---|---|---|
1 | HomeAddress | 1000001 |
2 | WorkAddress | 1000002 |
Rails définit automatiquement la valeur dans la colonne type.
En outre, le code pour obtenir les objets HomeAddress et WorkAddress de la base de données ressemble à ceci:
a1 = HomeAddress.find(1)
a2 = WorkAddress.find(2)
La valeur de l'id doit correspondre au nom de la classe dans la colonne type.
fields_for
= form_with model: @customer_form do |f|
= f.fields_for :customer, f.object.customer do |ff|
-#réduction
Vous pouvez utiliser la méthode d'instance du générateur de formulaire fields_for pour changer l'objet cible du formulaire. Vous pouvez générer plusieurs formulaires d'objet modèle avec le même formulaire. Le premier argument est le nom de l'enregistrement et le deuxième argument est l'objet cible.
Si l'objet Cusotmer est associé à un objet HomeAddress et WorkAddress
customer.save
customer.home_address.save
customer.work_address.save
L'enregistrement d'un objet Cusotmer n'enregistre pas automatiquement l'objet HomeAddress.
Toutefois, si l'objet Cusomer n'est pas enregistré dans la base de données, les objets HomeAddress et WorkAddress sont également automatiquement enregistrés.
transaction
ActiveRecord::Base.transaction do
customer.save!
customer.home_address.save!
customer.work_address.save!
end
Enfermé dans le bloc ActiveRecord :: Base.transaction, cette plage de traitement de base de données est exécutée comme une transaction.
Chapter 17 Capybara
let!
let(:staff_member) { create(:staff_member) }
let!(:staff_member) { create(:staff_member) }
La méthode let crée et stocke un objet la première fois qu'il est appelé, et renvoie le même résultat la deuxième fois. La méthode let! Diffère en ce qu'elle crée un objet au moment de la définition.
inclusion
validates :gender, inclusion: { in: %w(male female), allow_blank: true }
l'inclusion garantit que la valeur est dans une liste particulière.
def valid?
customer.valid? && customer.home_address.valid?
&& customer.work_address.valid?
end
Lorsque vous traitez plusieurs objets dans un formulaire, la vérification de la validation comme ci-dessus pose des problèmes. Si l'objet client échoue à la validation, il retournera false à ce stade, donc la validation home_address et work_address ne sera pas vérifiée. Par conséquent, l'erreur ne peut pas être affichée sur le formulaire.
def valid?
[ customer, customer.home_address, customer.work_address ]
.map(&:valid?).all?
end
Si vous transformez un objet en tableau et appelez valid? Pour chaque carte utilisant, le résultat sera renvoyé sous forme de tableau. La méthode all? Est une méthode qui vérifie si tous les éléments du tableau sont vrais. Vous pouvez désormais effectuer des contrôles de validation sur tous les objets.
autosave
class Customer < ApplicationRecord
has_one :home_address, dependent: :destroy, autosave: true
has_one :work_address, dependent: :destroy, autosave: true
end
Si vous spécifiez true pour l'option d'enregistrement automatique, l'objet associé sera également enregistré automatiquement.
Vous pouvez partager votre code avec ActiveSupport :: Concern. ActiveSupport :: Concern est également écrit dans Articles du chapitre précédent.
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 est un module de normalisation créé dans le chapitre précédent. valid_email_2 / email est un joyau qui ajoute la validation de votre adresse e-mail.
#Inclure dans le modèle que vous utilisez
include EmailHolder
mark_for_destruction
customer.home_address.mark_for_destruction
L'appel de la méthode mark_for_destruction sur l'objet de modèle associé le marquera pour suppression. La cible de suppression est supprimée lorsque le parent est enregistré dans la base de données. Dans l'exemple ci-dessus, la cible de suppression est home_address et le parent est client. Pour que ce mécanisme fonctionne, vous devez spécifier true pour l'option d'enregistrement automatique associée.
has_many :personal_phones, -> { where(address_id: nil).order(:id) },
class_name: "Phone", autosave: true
Vous pouvez indiquer la portée de l'association en spécifiant un objet Proc comme deuxième argument de has_many.
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
Lors de la création de plusieurs formulaires du même objet, vous pouvez les identifier avec l'option d'index. En ajoutant l'option index, l'attribut name de l'élément d'entrée change. Dans l'exemple ci-dessus, ce serait le formulaire [client] [téléphones] [0] [numéro].
Nous ajouterons les URL des articles suivants un par un.
Ruby on Rails6 Practical Guide [Extensions] cp3 ~ cp6 [Memo] Ruby on Rails6 Practical Guide [Extensions] cp7 ~ cp9 [Memo] Ruby on Rails6 Practical Guide [Extensions] cp10 ~ cp12 [Memo]
Recommended Posts