[RUBY] Un hachage actif qui peut être traité comme des données même s'il n'est pas dans la base de données

introduction

Une fonction qui vous permet de sélectionner une préfecture dans le menu déroulant, qui est souvent vu dans les questionnaires. , Vous pouvez avoir la possibilité de publier en utilisant la méthode form_with. Cependant, il est plus facile d'utiliser la préfecture si elle est gérée numériquement sur la table. Afin de pouvoir gérer avec des valeurs numériques, il est nécessaire de préparer au préalable le nom de la préfecture et le numéro qui lui est associé. ActiveHash est une fonction pratique dans de tels cas.

Qu'est-ce que Active Hash

Gem qui vous permet de gérer les données sans les enregistrer dans la base de données en entrant des données qui ne changent fondamentalement pas dans le modèle. Principalement utilisé lorsque vous souhaitez afficher sous forme de menu déroulant dans la vue.

Le document officiel est ici

Flux de préparation

  1. Description de Gem
  2. Installez Gem
  3. Générer un modèle

1. Description de Gem

OK sur la dernière ligne du fichier

Gemfile


gem 'active_hash'

2. Installez Gem

% bundle install

3. Générer un modèle

%rails g nom du modèle du modèle--skip-migration

Le nom du modèle doit être tel que les menus déroulants soient regroupés. ex) Baseball, football, tennis ... Lors de la création d'un menu déroulant, le nom du modèle sera «sport».

En ajoutant l'option --skip-migration, le fichier de migration ne sera pas généré. ActiveHash ne stocke pas dans la base de données, il ne nécessite donc pas de fichier de migration.

Ci-après, le menu déroulant des sports sera décrit à titre d'exemple.

Flux de la description à l'affichage

  1. Définir et hériter des classes
  2. Décrivez les éléments du menu déroulant
  3. Décrivez l'association
  4. Décrivez la validation
  5. Afficher le menu déroulant

4. Définir et hériter des classes

Remplacez le modèle créé dans "3. Génération de modèle" par la description suivante.

app/models/sport.rb


class Sport < ActiveHash::Base
  self.data = []
end

En héritant d'ActiveHash :: Base, les méthodes ActiveRecord peuvent être utilisées.

5. Décrivez les éléments du menu déroulant

Hachez le contenu du menu déroulant dans le tableau.

app/models/sport.rb


class Sport < ActiveHash::Base
  self.data = [
    { id: 1, name: '---' },
    { id: 2, name: 'Baseball' },
    { id: 3, name: 'Soccer' },
    { id: 4, name: 'Tennis' }
  ]
end

6. Décrivez l'association

Vous trouverez ci-dessous une explication de l'hypothèse qu'il existe déjà une table pour stocker un autre article.

app/models/post.rb


class Post < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
    belongs_to_active_hash :sport
end

ʻExtend ActiveHash :: Associations :: ActiveRecordExtensions vous permet d'utiliser la méthode appartient_to_active_hash`.

Il n'est pas nécessaire de décrire les associations dans le modèle sportif.

* Notez que la description est différente de l'association normale </ font>

7. Décrivez la validation

app/models/post.rb


class Post < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
    belongs_to_active_hash :sport

  validates :sport_id, presence: true #Impossible d'enregistrer le message vide

  
  validates :sport_id, numericality: { other_than: 1 } 
                        #La sélection déroulante est "--Ne peut pas être enregistré lorsque
end

8. Afficher le menu déroulant

méthode collection_select


collection_select(Nom de colonne à enregistrer,Tableau d'objets,Éléments stockés dans des colonnes,Nom de colonne affiché dans les options,option,option html)
collection_select(:sport_id, Sport.all, :id, :name, {}, {class:"sport-select"})

Nom de la colonne à enregistrer: dans quelle colonne du tableau enregistrer. Tableau d'objets: Si vous voulez afficher tout le hachage du tableau, vous pouvez utiliser .all. Eléments sauvegardés dans la colonne: Dans ʻapp / models / sport.rb, je veux enregistrer la partie qui a été définie comme ʻid: dans la colonne. Nom de colonne affiché dans les options: Affiche la partie de ʻapp / models / sport.rbqui a été définie commenom:` dans le menu déroulant. Facultatif: au besoin option html: nom de classe, etc.

finalement

Quoi qu'il en soit, la méthode collection_select a trop d'arguments, ce qui peut prêter à confusion ...

Recommended Posts

Un hachage actif qui peut être traité comme des données même s'il n'est pas dans la base de données
Continuation ・ Hash actif qui peut être traité comme des données même s'il n'est pas dans la base de données ~ Affichage
Traitement lorsqu'un ID qui n'existe pas dans la base de données est entré dans l'URL
Même si j'écris le paramètre de STRICT_QUOTE_ESCAPING dans CATALINA_OPTS dans tomcat8.5, il n'est pas reflété.
Même si le chemin du fichier de propriétés est spécifié dans l'option -cp, il n'est pas reconnu comme chemin de classe.
Si vous obtenez l'erreur Les données ne peuvent pas être lues car elles sont manquantes dans le menu fixe pour mac
[Rails] Si CSS n'est pas appliqué dans collection_select, vérifiez si vous pouvez spécifier la classe.
Essayez d'enregistrer les données pouvant être lues par JavaFX au format PNG
[Rails] La lumière de texte de Bootstrap ne peut pas être héritée par la méthode link_to car la classe n'est pas écrite comme argument dans la méthode.
Le problème que le JDK défini dans JAVA_HOME n'apparaît pas même si java -version est exécuté à l'invite de commande
Y a-t-il une instance même si le constructeur échoue?
[Quarkus] Un piège qui ne fonctionne pas même si vous copiez et collez l'exemple GCP Pub / Sub tel quel
Cela ne fonctionne pas si la clé Map est un tableau
Le cas où @Autowired n'a pas pu être utilisé dans JUnit5
[Firebase] Firebase Auth currentUser ne devient pas nul même après la désinstallation de l'application
Résolution du problème suivant: «Le temps de réponse est trop long» dans le domaine d'origine, même si l'adresse IP et l'adresse EC2 peuvent être entrées dans le site.
[Rails] Que faire si les données ne sont pas enregistrées dans la base de données
Fonction similaire La partie bloquée pour la rendre asynchrone
Il semble que Java 14 ajoutera des fonctions de type classe de données
Il doit être identique à l'exemple lors de la connexion à Twitter, mais une erreur se produit jusqu'à la résolution
Solution Pay.JP lorsqu'elle fonctionne localement mais ne fonctionne pas bien en environnement de production
Êtes-vous toujours épuisé par la mise en œuvre de la fonction de recherche? Gem'ransack 'qui peut être implémenté en un instant
J'ai séparé la même description qu'une méthode sous private dans le contrôleur Rails et je l'ai implémentée pour qu'elle puisse être appelée avec before_action
Les données ne sont pas enregistrées dans Rails.
Que faire lorsque le préfixe c n'est pas lié dans JSP
Mémo: [Java] Si un fichier se trouve dans le répertoire surveillé, traitez-le.
[Rails] À propos de l'erreur selon laquelle l'image n'est pas affichée dans l'environnement de production
Obtenez le type d'un élément d'un tableau pour déterminer s'il s'agit d'un tableau
L'histoire selon laquelle le servlet n'a pas pu être chargé dans l'application Web Java
Le phénomène selon lequel vous ne pouvez pas vous déconnecter même s'il est décrit dans la conception
[Android Studio] Description qui peut être saisie en continu dans la base de données SQLite [Java]
Une histoire qui a souffert d'un espace qui ne disparaît pas même s'il est taillé avec Java La cause est BOM
Si la version JDK est correcte dans Eclipse mais qu'une erreur se produit ou que le compilateur ne fonctionne pas correctement