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.
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]
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"
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.
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é.
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.
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.
rel = rel.distinct
Vous pouvez supprimer les doublons des résultats de recherche en appelant la méthode distincte.
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.
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.
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.
Les associations plusieurs-à-plusieurs peuvent être divisées en une combinaison de deux associations un-à-plusieurs à l'aide d'une table de liens.
number_with_delimiter(100000)
100 000 seront retournés.
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.
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.
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.
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]
Recommended Posts