Ruby on Rails6 Guide pratique cp16 ~ cp18 [Mémo]

introduction

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.

Aperçu

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]

Chapitre 16 Héritage d'une table unique

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.


Moment de l'enregistrement des objets associés

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.


Validez plusieurs objets en même temps

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.


Partager la normalisation et la validation

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

Chapitre 18 Objets de formulaire

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.


Périmètre de l'association

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

A continué

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]

Source du devis

Recommended Posts

Ruby on Rails6 Guide pratique cp13 ~ cp15 [Mémo]
Ruby on Rails6 Guide pratique cp4 ~ cp6 [Mémo]
Ruby on Rails6 Guide pratique cp10 ~ cp12 [Memo]
Ruby on Rails6 Guide pratique cp16 ~ cp18 [Mémo]
Ruby on Rails6 Guide pratique [Extensions] cp7 ~ cp9 [Mémo]
Guide pratique Ruby on Rails6 [Extensions] cp10 ~ cp12 [Memo]
Ruby on Rails6 Guide pratique [Extensions] cp3 ~ cp6 [Mémo]
Ruby on Rails élémentaire
Association Ruby On Rails
[Ruby on Rails] Mémo d'introduction Select2 pour Webpacker
[Note personnelle] Construction de l'environnement Ruby on Rails (Windows)
Record d'apprentissage de Ruby on rails -2020.10.03
Création de portfolio Ruby on Rails
Record d'apprentissage Ruby on rails -2020.10.04
Ruby on Rails5 Guide pratique d'apprentissage rapide 5.2 Chapitre 2 compatible
[Ruby on Rails] Debuck (binding.pry)
Record d'apprentissage de Ruby on rails -2020.10.05
Record d'apprentissage de Ruby on rails -2020.10.09
Record d'apprentissage Ruby on rails-2020.10.07 ②
Ruby on Rails5 Guide pratique d'apprentissage rapide 5.2 Chapitre compatible3
Record d'apprentissage Ruby on rails-2020.10.07 ①
Annuler la migration de Ruby on Rails
Record d'apprentissage de Ruby on rails -2020.10.06
Résumé de la validation Ruby on Rails
Mémorandum de base Ruby on Rails
[Ruby on Rails] Read try (: [] ,: key)
Variables Ruby on Rails, résumé constant
Installation de Ruby + Rails sur Ubuntu 18.04 (rbenv)
[Ruby on Rails] Introduction de la fonction de pagination
Connaissance de base de Ruby on Rails
Progatez Ruby on Rails
Ruby on Rails compatible japonais-anglais i18n
(Ruby on Rails6) "Effacer" le contenu publié
[Ruby on Rails] Fonction de sortie CSV
[Ruby on Rails] Création de la page de confirmation
Ruby On Rails conçoit un conflit de routage
[Ruby on Rails] Implémentation de la fonction de commentaire
[Ruby on Rails] DM, fonction de chat
[Ruby on Rails] Méthode d'aide pratique
[Ruby on Rails] Arrêtez de "boucler jusqu'à ce que ..."
[Ruby on Rails] Introduction des données initiales
[Ruby on Rails] Fonction de recherche (non sélectionnée)
[Rails] Ajout de la fonction de commentaire Ruby On Rails
[Ruby on Rails] Création d'un formulaire de demande
[Ruby on Rails] Vérification du code à l'aide de Rubocop-airbnb
[Ruby on Rails] 1 modèle CRUD (routage principal)
Méthode d'installation de Ruby on Rails [édition Mac]
Modèle [Ruby on Rails], commande de terminal de contrôleur
Commande de création / suppression de modèle Ruby on Rails