[RUBY] [Rails 6.0] À propos de la sauvegarde par lots de plusieurs enregistrements

introduction

Depuis que j'ai implémenté la fonction de gestion des commandes dans mon application personnelle, je vais afficher la méthode de sauvegarde par lots de plusieurs enregistrements que j'ai appris à ce moment-là.

Matériel de référence

En créant cet article, j'ai beaucoup fait référence aux articles suivants. Je vous en suis vraiment reconnaissant. [Rails 5] Procédure d'enregistrement par lots des modèles [Rails 6] Enregistrez-vous collectivement en utilisant form_with 1.2. Mise en œuvre du formulaire d'enregistrement par lots

Produit

商品登録.png

Enregistrer uniquement les produits dont la case est cochée 商品保存.png

商品一覧.png

Conditions préalables

Modèle du produit

Column Type
name string
price integer
unit string
availability boolean

models/product.rb


class Product < ApplicationRecord

  with_options presence: true do
   validates :name
   validates :unit
   validates :price, numericality: {only_integer: true, greater_than_or_equal_to: 0 }
   validates :availability, inclusion: { in: [true, false] }
  end

end

politique

  1. Créez un modèle de collection pour enregistrer plusieurs produits à la fois
  2. Décrivez le processus d'enregistrement des lots sur le contrôleur
  3. Créez un formulaire qui vous permet d'enregistrer plusieurs produits à la fois sur l'écran de visualisation

1. Créez un modèle de collection pour enregistrer plusieurs produits à la fois

Créez un répertoire de formulaires dans le répertoire models et créez un modèle ProductCollection et un modèle de base dedans.

models/form/product_collection


class Form::ProductCollection < Form::Base
  FORM_COUNT = 10 #Ici, spécifiez le nombre de formulaires d'inscription que vous souhaitez créer
  attr_accessor :products 

  def initialize(attributes = {})
    super attributes
    self.products = FORM_COUNT.times.map { Product.new() } unless self.products.present?
  end
  
  def products_attributes=(attributes)
    self.products = attributes.map { |_, v| Product.new(v) }
  end

  def save
    Product.transaction do
      self.products.map do |product|
        if product.availability #Seuls les produits pour lesquels la case est cochée ici sont enregistrés.
          product.save
        end
      end
    end
      return true
    rescue => e
      return false
  end
end

models/form/base.rb


class Form::Base
  include ActiveModel::Model
  include ActiveModel::Callbacks
  include ActiveModel::Validations
  include ActiveModel::Validations::Callbacks

end

2. Créez une instance et traitez les données sur le contrôleur

controllers/products_controller.rb



class ProductsController < ApplicationController
  
  def new
    @form = Form::ProductCollection.new
  end

  def create
    @form = Form::ProductCollection.new(product_collection_params)
    if @form.save
      redirect_to products_path, notice: "J'ai enregistré le produit"
    else
      flash.now[:alert] = "L'enregistrement du produit a échoué"
      render :new
    end

  end

  private
  
    def product_collection_params
        params.require(:form_product_collection)
        .permit(products_attributes: [:name, :price, :unit, :availability])
    end
    
end

@ form = Form :: ProductCollection.new générera une instance du modèle que vous venez de créer. Des paramètres forts sont reçus dans products_attributes.

3. Créez un formulaire qui vous permet d'enregistrer plusieurs produits à la fois sur l'écran de visualisation

ruby:views/products/new.html.haml


= form_with model: @form, url: products_path, method: :post, local: true do |form|
  %table
    %thread
      %tr
        %inscription
        %nom du produit
        %e prix de vente (yen)
        %ème unité de commande
  %tbody
    = form.fields_for :products do |f|
      %tr
        %td.text-center
          = f.check_box :availability
        %td
          = f.text_field :name
        %td
          = f.text_field :price
        %td
          = f.text_field :unit
  = form.submit "Enregistrement groupé"
  = link_to "Revenir", :back

Je crée un formulaire qui peut être enregistré plusieurs fois en utilisant form_with et fields_for.

Vous pouvez maintenant tout enregistrer en même temps.

finalement

Merci pour votre visite. Si vous avez des erreurs, veuillez les signaler.

Recommended Posts

[Rails 6.0] À propos de la sauvegarde par lots de plusieurs enregistrements
[Rails] Répertorier les instances de plusieurs modèles
[Rails] À propos de la mise en œuvre de la fonction similaire
À propos des rails 6
À propos du routage des rails
[Rails] À propos d'ActiveJob,!
À propos du contrôleur Rails
[Rails] À propos des fichiers de migration
[Rails 6] À propos des principaux joyaux
À propos de disconnect () de HttpURLConnection
[Rails] Présentation de PAY.JP
À propos de la spécification de version des rails
À propos de DI of Spring ①
À propos de DI of Spring ②
Enregistrement de plusieurs WebMvcConfigurers
À propos de form. ○○ de form_with
[rails] concevoir les valeurs par défaut
rails Paramètres forts
[Débutant] À propos de la session Rails
À propos de l'exécution régulière de la tâche de râteau de l'application de rails dans Heroku
Une note sur la fonction de départ de Ruby on Rails
Les enregistrements existants disparaissent lors de la construction du modèle has_one (rails)