[RUBY] Enregistrer les informations sur le contenu de l'élément ~ Active_Hash ~

Lors de la mise en œuvre du format d'enregistrement des informations, il est inévitable de sauvegarder les éléments sélectionnés (collection, etc.) dans la base de données. Pour les applications telles que Furima, vous devez enregistrer la préfecture, l'état du produit, le délai de livraison, etc. Si vous assumez un questionnaire, vous pouvez le voir dans diverses situations telles que le sexe et la date de naissance. Je pense que beaucoup de gens supposent que le contenu de l'élément est préparé à l'avance dans seed.rb etc. pour créer un tableau, mais il n'est pas exagéré de dire que c'est un tableau inutile.

Table inutile? La "normalisation" est souvent utilisée dans la conception de bases de données. En gros, il s'agit de rendre la structure de vos données efficace et simple. Cependant, si cette normalisation est effectuée à fond, le nombre de petites tables augmentera, ce qui contribue également à la charge de traitement. Par conséquent, il faut éviter autant que possible de créer une table dédiée aux items.

Active_hash est utile dans un tel cas.

Qu'est-ce que Active_hash? Les articles peuvent être préparés sans passer par la base de données en créant un modèle dédié et en préparant les valeurs du contenu des articles à l'avance. Pour ainsi dire, vous allez créer une "table d'articles dans le modèle". En faisant cela, il n'est pas nécessaire de préparer une petite table du côté DB, donc la charge est allégée.

Procédure d'installation Cette fois, je vais l'implémenter en supposant un questionnaire produit utilisant collection_select. Les quatre contenus suivants doivent être enregistrés et gérés. ・ Âge ·sexe ・ Comment j'ai découvert le produit ・ Impressions d'utilisation du produit

Je veux avoir une table compte tenu de la charge DB. En tant que design

  1. Les adolescents à 90 ans
  2. Le sexe est masculin / féminin
  3. Comment avez-vous connu le produit? Publicité, connaissances, famille, Internet
  4. Saisissez manuellement vos impressions sur l'utilisation du produit Je vais continuer.

Parmi ceux-ci, les éléments (collection_select) que vous souhaitez utiliser sont les contenus 1 à 3. Supposons cela et implémentons le questionnaire. Veuillez noter que cette explication est limitée à l'implémentation de active_hash et que les autres étapes sont omises.

Étape: 1 Ajoutez active_hash à Gemfile et exécutez l'installation

gem 'active_hash'

Terminal

% bundle install

Étape: 2 Préparation du modèle et du fichier de migration

Générez un modèle avec la commande g * Le nom du modèle est votre choix

% rails g model model question

・ Préparation du dossier de migration

Lors de l'utilisation de active_hash, le contenu des éléments est géré par la colonne entière. Cette colonne entière fonctionne comme un identifiant. Par conséquent, veillez à ajouter "_id" au nom de la colonne. Le champ de saisie manuelle est implémenté avec la colonne de texte habituelle.

00000000000000_create_questions.rb

class CreateQuestions < ActiveRecord::Migration[6.0]
  def change
    create_table :questions do |t|
      t.integer :age_id,         null: false
      t.integer :sexuality_id,   null: false
      t.integer :find_item_id,   null: false
      t.text    :comment,        null: false
      t.timestamps
    end
  end
end

Créez ensuite la table comme d'habitude et exécutez le fichier de migration.

% rails db:create
% rails db:migrate

-Créer un fichier modèle pour chaque article Préparez trois éléments du modèle qui implémente active_hash. Le fichier de migration n'étant pas nécessaire, ajoutez une option et ignorez-la.

% rails g model age --skip-migration
% rails g model sexuality --skip-migration
% rails g model find_item --skip-migration

Écrivons le contenu du modèle préparé pour chaque élément

Je pense que l'intérieur du modèle généré ressemble probablement à ceci au début

class Age < ApplicationRecord
end

Pour en faire un modèle dédié à active_hash, modifiez-le comme suit.

class Age < ActiveHash::Base
end

Cela permet de créer une pseudo table d'éléments dans ce modèle. Lors de la mise en place d'éléments, nous l'implémenterons en utilisant des méthodes de classe et des hachages. Le but d'améliorer la lisibilité est d'utiliser la première clé comme identifiant et de «donner à l'autre clé le nom que vous souhaitez traiter comme un élément. Exemple

nom de classe de classe< ActiveHash::Base
  self.data = [
  { id: 0, hoge: fuga }]
end

Parallèlement à cela, cela devient comme suit.

class Age < ActiveHash::Base
  self.data = [
      { id: 0, name: '---' },
      { id: 1, name: '10 ans' },
      { id: 2, name: '20 ans' },
      { id: 3, name: '30 s' },
      { id: 4, name: 'Quarante' },
      { id: 5, name: 'Années 50' },
      { id: 6, name: 'Années 60' },
      { id: 7, name: 'Années 70' },
      { id: 8, name: 'Années 80' },
      { id: 9, name: 'Années 90' }
  ]
class FindItem < ActiveHash::Base
  self.data = [
    { id: 0, example: '---' },
    { id: 1, example: 'J'ai appris de la publicité' },
    { id: 2, example: 'J'ai appris de l'introduction d'une connaissance' },
    { id: 3, example: 'J'ai appris d'une introduction en famille' },
    { id: 4, example: 'Je savais sur internet' }
  ]
end
class Sexuality < ActiveHash::Base
  self.data = [
    { id: 0, name: '---' },
    { id: 1, name: 'Masculin' },
    { id: 2, name: 'Femme' }
  ]
end

Ceci termine la création de la pseudo table à l'aide de active_hash. Après cela, je donnerai une description à lier avec le modèle de question qui a été créé en premier, qui est la base.

class Question < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to_active_hash :age
  belongs_to_active_hash :sexuality
  belongs_to_active_hash :find_item
end

Étape: 3 Afficher la description du fichier
<h1>Veuillez coopérer avec le questionnaire sur nos produits</h1>

<div class="wrapper">
  <div class="form">
    <%= form_with model: @question, local: true do |f| %>
      <div class="form-box">
        <h3>Veuillez sélectionner l'âge</h3>
        <%= f.collection_select(:age_id, Age.all, :id, :name) %>
      </div>
      <div class="form-box">
        <h3>S'il vous plait selectionnez votre genre</h3>
        <%= f.collection_select(:sexuality_id, Sexuality.all, :id, :name)%>
      </div>
      <div class="form-box">
        <h3>Où avez-vous découvert nos produits?</h3>
        <%= f.collection_select(:find_item_id, FindItem.all, :id, :example)%>
      </div>
      <div class="form-text">
        <h3>Veuillez noter vos impressions sur l'utilisation de nos produits car ils sont faciles à utiliser.</h3>
        <%= f.text_area :comment %>
      </div>
      <%= f.submit "Envoyer" %>
    <% end %>
  </div>
</div>

Le point est l'argument de collection_select. Le premier argument est la valeur passée aux params (nom de la colonne) et le second argument est l'élément à afficher (nom du modèle).

Étape: 4 Description du contrôleur
class QuestionsController < ApplicationController
  def index
    @question = Question.new
  end

  def create
    # binding.pry
    @question = Question.new(question_params)
    @question.save
    redirect_to root_path
  end

  private
  def question_params
    params.require(:question).permit(
      :age_id, 
      :sexuality_id, 
      :find_item_id, 
      :comment)
  end
end

Il n'y a pas de mention particulière ici.

J'ai essayé de l'implémenter brièvement

Veuillez essayer active_hash par tous les moyens.

Recommended Posts

Enregistrer les informations sur le contenu de l'élément ~ Active_Hash ~