Ruby on Rails6 Guide pratique [Extensions] cp3 ~ cp6 [Mémo]

introduction

L'auteur de cet article est un débutant qui commence à peine à apprendre la programmation. Je vous serais reconnaissant si vous pouviez signaler des 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. Je vais sauter cp1 et cp2 de l'extension de fonction car ils expliquent la construction de l'environnement et le code de la partie principale.

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] Guide pratique Ruby on Rails6 cp16 ~ cp18 [Memo]

Extension des fonctions Formulaire de recherche du chapitre 3

nom de l'index

La méthode add_index génère un nom par défaut comme suit:

Cependant, il existe une limite au nom de l'index, donc si vous combinez un grand nombre de colonnes en tant qu'index composite, vous pouvez dépasser la limite. Dans ce cas, vous devez spécifier le nom de l'index à l'aide de l'option de nom.

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

Index composé

Si un index composite est défini pour les colonnes X, Y et Z, cet index composite sera utilisé pour les recherches pour la colonne X seule, les recherches qui combinent les colonnes X et Y et les recherches qui combinent trois colonnes. Cependant, cet index composite n'est pas utilisé pour une recherche de la colonne Y seule, une recherche de la colonne Z seule ou une recherche d'une combinaison des colonnes Y et Z. Ainsi, pour optimiser la recherche de toutes les combinaisons, vous devez définir l'index comme ci-dessous.


Différence entre &. (Opérateur Bocchi) et méthode try

Les deux méthodes renvoient nul lorsque le récepteur est nul, mais le comportement est légèrement différent lorsque le récepteur est différent de nul. Si vous essayez d'appeler une méthode qui n'est pas définie dans le récepteur avec &., NoMethodError se produira, mais si c'est try, nil sera retourné.

user&.name
user.try(:name)

Dans l'exemple ci-dessus, si la méthode d'instance de l'utilisateur n'a pas de nom, NoMethodError ne se produira que lorsque &. Est utilisé.


Accumuler des objets Relation

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

Le code ci-dessus est un objet de formulaire. Définit un objet de recherche qui renvoie les résultats de la recherche. Puisque where et order renvoient un objet Relation, vous pouvez stocker diverses conditions de recherche dans l'objet Relation comme dans le code ci-dessus.

Joindre des tables avec des jointures

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

La méthode join effectue une jointure de table </ strong>. Les jointures de table vous permettent de filtrer les enregistrements en fonction des valeurs de colonne d'autres tables. L'argument de la méthode join est le nom de l'association. Cette méthode renvoie également un objet Relation. Lorsque vous rejoignez une table, vous pouvez rechercher d'autres tables comme le code de la deuxième ligne.

Supprimer la duplication

rel = rel.distinct

Vous pouvez supprimer les doublons des résultats de recherche en appelant la méthode distincte.

Extension des fonctions Chapitre 4 Connexion automatique à partir de la prochaine fois

cookies

cookies.signed[:user_id] = user.id

L'appel de la méthode signée rend la valeur du cookie illisible et immuable.

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

La méthode permanente définit la date d'expiration des cookies après 20 ans.

cookies.delete(:user_id)

Vous pouvez effacer l'identifiant enregistré dans le cookie avec le code ci-dessus.


Test des cookies

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

La première ligne cherche à voir si le cookie a une clé appelée "customer_id". La deuxième ligne cherche à voir si la valeur du cookie est désactivée. Les cookies non visibles sont caractérisés par un nombre hexadécimal à 40 chiffres à la fin, nous étudions donc cela à l'aide d'expressions régulières.

Extension des fonctions Chapitre 5 Restrictions d'accès par adresse IP

Vérifiez que la valeur est numérique

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

la numéricité vérifie si la valeur n'est qu'un nombre. Si vous spécifiez true pour only_integer, seuls les entiers seront mis en correspondance. Avec l'inclusion seule, une chaîne de caractères telle que "XYZ" sera remplacée par l'entier 0, donc aucune erreur ne se produira. la numéricité entraînera une erreur car la validation est effectuée sur la valeur avant la conversion.

Rails Guide a plus de détails.

Extension des fonctions Chapitre 6 Association plusieurs-à-plusieurs

Les associations plusieurs-à-plusieurs peuvent être divisées en une combinaison de deux associations un-à-plusieurs à l'aide d'une table de liens.


Ajouter une virgule à 3 chiffres au nombre

number_with_delimiter(100000)

100 000 seront retournés.


Compter le nombre d'associations plusieurs-à-plusieurs

Lorsqu'un client et un programme ont une relation plusieurs-à-plusieurs,

program.cusotmers.count

Vous pouvez compter le nombre de participants au programme comme suit. Cependant, les performances seront médiocres car des requêtes complexes utilisant JOIN seront émises.

Il en va de même même si vous comptez les applications (entrées) de la table de liens, vous pouvez donc également écrire comme ci-dessous.

program.entries.count

Le comptage du nombre de tables liées empêchera l'émission de requêtes complexes et améliorera les performances.

Résolvez le problème N + 1

Avec le code ci-dessus, le nombre de candidats est compté pour chaque programme, il y a donc un "problème N + 1". Le code ci-dessous vous permettra d'obtenir le nombre de candidats pour chaque programme avec une seule requête.

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

Spécifiez le nom de l'association dans l'argument de jointure. Ce n'est pas un nom de table. Dans l'argument de la méthode select, spécifiez la colonne pour obtenir la valeur de la table. La fonction SQL COUNT renvoie le nombre d'enregistrements dans lesquels la valeur de colonne spécifiée dans l'argument n'est pas NULL. Puisque AS nomme la valeur sur le côté gauche, vous pouvez obtenir le nombre d'enregistrements dans la table des entrées sous la forme d'une colonne appelée number_of_applicants. La méthode group divise les enregistrements en groupes en fonction de la colonne spécifiée dans l'argument. En principe, lorsqu'une fonction d'agrégation telle que COUNT est spécifiée pour select, un appel est requis. En divisant en groupes, vous pouvez obtenir le nombre d'entrées pour chaque program_id.

program[:number_of_applicants]

Vous pouvez vous y référer comme ci-dessus.

Jointure externe gauche de la table

Lorsque vous joignez normalement des tables avec la méthode de jointure, les enregistrements qui ne sont pas du tout référencés dans la table jointe sont exclus des résultats de la recherche. En d'autres termes, seuls les programmes pour lesquels une ou plusieurs candidatures ont été soumises seront recherchés.

left_joins(:entries)

Si vous réécrivez les jointures avec left_joins, les enregistrements non référencés resteront.

A continué

Nous ajouterons les URL des articles suivants un par un.

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 [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 Rails6 Guide pratique cp13 ~ cp15 [Mémo]
Ruby on Rails6 Guide pratique cp7 ~ cp9 [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]
Mémo de construction de l'environnement Ruby on Rails 6.0
[Ruby on Rails] Mémo d'introduction Select2 pour Webpacker
[Note personnelle] Construction de l'environnement Ruby on Rails (Windows)
Ruby on Rails élémentaire
Principes de base de Ruby on Rails
Association Ruby On Rails
Ruby on Rails5 Guide pratique d'apprentissage rapide 5.2 Chapitre 2 compatible
Ruby on Rails5 Guide pratique d'apprentissage rapide 5.2 Chapitre compatible3
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 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 ②
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
Comment utiliser 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] 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] Afficher le test avec RSpec
[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