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.
Active_hash est utile dans un tel cas.
Je veux avoir une table compte tenu de la charge DB. En tant que design
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.
gem 'active_hash'
Terminal
% bundle install
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
<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).
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