[RUBY] [Rails 6.0] Informationen zum Batch-Speichern mehrerer Datensätze

Einführung

Da ich die Auftragsverwaltungsfunktion in meiner persönlichen App implementiert habe, werde ich die Methode zum Speichern mehrerer Datensätze ausgeben, die ich zu diesem Zeitpunkt gelernt habe.

Referenzmaterial

Bei der Erstellung dieses Artikels habe ich stark auf die folgenden Artikel verwiesen. Ich bin dir wirklich dankbar. [Rails 5] Verfahren zur Chargenregistrierung von Modellen [Rails 6] Gemeinsam mit form_with registrieren 1.2. Implementierung des Batch-Registrierungsformulars

Produkt

商品登録.png

Nur Produkte mit aktiviertem Kontrollkästchen registrieren 商品保存.png

商品一覧.png

Voraussetzungen

Produktmodell

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

Politik

  1. Erstellen Sie ein Sammlungsmodell zum gleichzeitigen Speichern mehrerer Produkte
  2. Beschreiben Sie den Prozess für die Chargenregistrierung auf dem Controller
  3. Erstellen Sie ein Formular, mit dem Sie mehrere Produkte gleichzeitig auf dem Ansichtsbildschirm registrieren können

1. Erstellen Sie ein Sammlungsmodell zum gleichzeitigen Speichern mehrerer Produkte

Erstellen Sie ein Formularverzeichnis im Modellverzeichnis und erstellen Sie ein ProductCollection-Modell und ein Basismodell darin.

models/form/product_collection


class Form::ProductCollection < Form::Base
  FORM_COUNT = 10 #Geben Sie hier die Anzahl der Registrierungsformulare an, die Sie erstellen möchten
  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 #Es werden nur die Produkte gespeichert, für die hier das Kontrollkästchen aktiviert ist.
          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. Erstellen Sie eine Instanz und verarbeiten Sie Daten auf dem Controller

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: "Ich habe das Produkt registriert"
    else
      flash.now[:alert] = "Produktregistrierung fehlgeschlagen"
      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 generiert eine Instanz des soeben erstellten Modells. Starke Parameter werden in products_attributes empfangen.

3. Erstellen Sie ein Formular, mit dem Sie mehrere Produkte gleichzeitig auf dem Ansichtsbildschirm registrieren können

ruby:views/products/new.html.haml


= form_with model: @form, url: products_path, method: :post, local: true do |form|
  %table
    %thread
      %tr
        %Registrierung
        %th Produktname
        %Verkaufspreis (Yen)
        %th Bestelleinheit
  %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 "Massenregistrierung"
  = link_to "Rückkehr", :back

Ich erstelle ein Formular, das mit form_with und fields_for mehrfach registriert werden kann.

Jetzt können Sie alles auf einmal speichern.

Schließlich

Danke für Ihren Besuch. Wenn Sie Fehler haben, weisen Sie bitte darauf hin.

Recommended Posts

[Rails 6.0] Informationen zum Batch-Speichern mehrerer Datensätze
[Schienen] Listen Sie Instanzen mehrerer Modelle auf
[Rails] Über die Implementierung der Like-Funktion
Über Schienen 6
Informationen zum Rails-Routing
[Rails] Über ActiveJob!
Über Rails Controller
[Rails] Informationen zu Migrationsdateien
[Schienen 6] Über die wichtigsten Edelsteine
Informationen zum Trennen () von HttpURLConnection
[Rails] Einführung von PAY.JP
Informationen zur Versionsspezifikation für Schienen
Über DI des Frühlings ①
Über DI des Frühlings ②
Registrierung mehrerer WebMvcConfigurers
Informationen zum Formular. ○○ von form_with
[Schienen] Standardwerte festlegen
Schienen Starke Parameter
[Anfänger] Über Rails Session
Über die regelmäßige Ausführung der Rechenaufgabe der Schienenanwendung in Heroku
Ein Hinweis zum Seed-Feature von Ruby on Rails
Vorhandene Datensätze verschwinden beim Erstellen des has_one-Modells (Rails).