[RUBY] [Rails] Implementierung der Couponfunktion (mit automatischer Löschfunktion mittels Stapelverarbeitung)

Ziel

ezgif.com-video-to-gif (1).gif

Entwicklungsumgebung

・ Ruby: 2.5.7 Schienen: 5.2.4 ・ Vagrant: 2.2.7 -VirtualBox: 6.1 ・ Betriebssystem: macOS Catalina

Annahme

Folgendes wurde implementiert.

Schlanke EinführungEinführung von Bootstrap 3

Implementierung

1. Spalte hinzufügen

Terminal


$ rails g model Coupon user_id:integer is_valid:boolean limit:integer

~__create_coupons.rb


class CreateCoupons < ActiveRecord::Migration[5.2]
  def change
    create_table :coupons do |t|
      t.integer :user_id
      t.boolean :is_valid, default: true # 「default:Fügen Sie "true" hinzu
      t.integer :limit

      t.timestamps
    end
  end
end

Terminal


$ rails db:migrate

2. Bearbeiten Sie das Modell

user.rb


#Nachtrag
has_many :coupons, dependent: :destroy

coupon.rb


class Coupon < ApplicationRecord
  belongs_to :user

  enum is_valid: { 'Wirksamkeit': true, 'Ungültig': false }

  def self.coupon_create(user)
    coupon = Coupon.new(user_id: user.id, limit: 1)
    coupon.save
  end

  def self.coupon_destroy
    time = Time.now
    coupons = Coupon.all
    coupons.each do |coupon|
      if coupon.created_at + coupon.limit.days < time && coupon.is_valid == 'Wirksamkeit'
        coupon.is_valid = 'Ungültig'
        coupon.save
      end
    end
  end
end

[Erläuterung]

① Verwalten Sie den Status von Gutscheinen mit Aufzählung.

enum is_valid: { 'Wirksamkeit': true, 'Ungültig': false }

② Definieren Sie eine Methode zum Erstellen eines Gutscheins.

def self.coupon_create(user)
  coupon = Coupon.new(user_id: user.id, limit: 1)
  coupon.save
end

③ Definieren Sie eine Methode zum Löschen des Gutscheins.

def self.coupon_destroy
  time = Time.now
  coupons = Coupon.all
  coupons.each do |coupon|
    if coupon.created_at + coupon.limit.days < time && coupon.is_valid == 'Wirksamkeit'
      coupon.is_valid = 'Ungültig'
      coupon.save
    end
  end
end

** ◎ Wenn seit der Erstellung des Gutscheins 24 Stunden vergangen sind und der Gutscheinstatus gültig ist, ändern Sie ihn in ungültig und speichern Sie ihn. ** **.

if coupon.created_at + coupon.limit.minutes < time && coupon.is_valid == 'Wirksamkeit'
  coupon.is_valid = 'Ungültig'
  coupon.save
end

3. Erstellen / bearbeiten Sie coupons_controller.rb

Terminal


$ rails g controller coupons index

coupons_controller.rb


class CouponsController < ApplicationController
  def index
    @coupons = Coupon.where(user_id: current_user.id, is_valid: 'Wirksamkeit') 
  end
end

4. Bearbeiten Sie "books_controller.rb"

Dieses Mal werden wir es so implementieren, dass ein Gutschein ausgestellt wird, wenn das Buch erfolgreich veröffentlicht wurde.

books_controller.rb


def create
  @book = Book.new(book_params)
  @book.user_id = current_user.id
  if @book.save
    Coupon.coupon_create(current_user) #Nachtrag
    redirect_to books_path
  else
    @books = Book.all
    render 'index'
  end
end

5. Ändern Sie die Datums- und Uhrzeiteinstellungen

① Bearbeiten Sie application.rb.

application.rb


module Bookers2Debug
  class Application < Rails::Application
    config.load_defaults 5.2
    config.time_zone = 'Tokyo' #Nachtrag
  end
end

(2) Erstellen / bearbeiten Sie eine Datei, um das Datums- und Uhrzeitformat festzulegen

Terminal


$ touch config/initializers/time_formats.rb

time_formats.rb


Time::DATE_FORMATS[:datetime_jp] = '%Y/%m/%d/%H:%M'

6. Ansicht bearbeiten

slim:coupons/index.html.slim


.row
  .col-xs-3

  .col-xs-6
    table.table
      thead
        tr
          th
            |Gutscheinnummer
          th
            |Titel

      tbody
        - @coupons.each.with_index(1) do |coupon, index|
          tr
            td
              = index
            td
              - limit = coupon.created_at + coupon.limit.minutes
              = limit.to_s(:datetime_jp)

  .col-xs-3

[Erläuterung]

(1) Zeigen Sie einen Tag nach dem Datum und der Uhrzeit der Couponerstellung das in "5" festgelegte Format an.

- limit = coupon.created_at + coupon.limit.minutes
= limit.to_s(:datetime_jp)

7. Implementierung der automatischen Löschfunktion

① Edelstein einführen

Gemfile


#Nachtrag
gem 'whenever', require: false

Terminal


$ bundle

② Erstellen und bearbeiten Sie "Schedule.rb"

Terminal


$ bundle exec wheneverize .

config/schedule.rb


env :PATH, ENV['PATH'] #Geben Sie einen relativen Pfad von einem absoluten Pfad an
set :output, 'log/cron.log' #Legen Sie die Zieldatei für die Protokollausgabe fest
set :environment, :development #Umgebung einstellen

every 1.minute do
  runner 'Coupon.coupon_destroy'
end

4. Reflect cron

Terminal


$ bundle exec whenever --update-crontab

Befehle, die häufig in der Stapelverarbeitung verwendet werden

crontab -e ➡︎ Bearbeiten Sie cron auf dem Terminal

$ bundle exec when ➡︎ Überprüfen Sie die Cron-Einstellungen

$ bundle exec wann immer --update-crontab ➡︎ Reflect cron

$ bundle exec wann immer --clear-crontab ➡︎ Cron entfernen

Recommended Posts

[Rails] Implementierung der Couponfunktion (mit automatischer Löschfunktion mittels Stapelverarbeitung)
[Rails] Implementierung der Suchfunktion mit Gem's Ransack
[Rails] Implementierung der Bildvergrößerungsfunktion mit Lightbox2
[Rails] Implementierung der Drag & Drop-Funktion (mit Wirkung)
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Vorbereitung"
[Rails] Implementierung der Kategoriefunktion
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der "Seed Edition" der Vorfahren
[Rails] Implementierung der Tutorial-Funktion
[Rails] Implementierung einer ähnlichen Funktion
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Edit Form Edition"
[Rails] Implementierung der automatischen Adresseneingabe mit jpostal und jp_prefecture
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Erstellungsformular"
[Rails] Implementierung des logischen Löschens durch den Benutzer
[Rails] Implementierung der CSV-Importfunktion
[Rails] Asynchrone Implementierung der Like-Funktion
[Rails] Über die Implementierung der Like-Funktion
[Rails] Implementierung der Benutzerrückzugsfunktion
[Rails] Implementierung der CSV-Exportfunktion
[Rails] Implementierung einer neuen Registrierungsfunktion im Assistentenformat mit devise
[Rails] Implementierung der Tag-Funktion mit Acts-as-Taggable-On und der Funktion zur Vervollständigung der Tag-Eingabe mit Tag-It
Implementierung der Benutzerauthentifizierungsfunktion mit devise (2)
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Ich habe versucht, ein Fenster mit Bootstrap 3 zu erstellen"
Implementierung der Benutzerauthentifizierungsfunktion mit devise (1)
Rails [Für Anfänger] Implementierung der Kommentarfunktion
Implementierung der Benutzerauthentifizierungsfunktion mit devise (3)
[Ruby on Rails] Implementierung einer ähnlichen Funktion
[Rails] Ich werde die Prozedur zum Implementieren der Follow-Funktion mit form_with erklären.
Implementierung der Ruby on Rails-Anmeldefunktion (Sitzung)
Ruby on Rails Implementierung der automatischen Mail-Sendefunktion
[Rails] Implementierung des PV-Nummernrankings mit Impressionist
[Rails] Implementierung einer Bild-Diashow mit Bootstrap 3
Implementierung der Ruby on Rails-Anmeldefunktion (Devise Edition)
Implementierung der Suchfunktion
Verwenden der PAY.JP-API mit Rails ~ Implementierungsvorbereitung ~ (payjp.js v2)
Implementierung der Pagenationsfunktion
Steuern Sie den Spring Batch-Verarbeitungsablauf mit JavaConfig.
Implementierung der Rails CRUD-Funktion ① (Neuzugang, diesmal Löschung)
Informationen zur Implementierung der Zusammenführungsverarbeitung einschließlich der Sortierfunktion der Stream-API
Ruby on Rails Einstellung der automatischen E-Mail-Sendefunktion (über Google Mail)
Achten Sie bei der Verwendung von MessageEncryptor mit Rails 5.2 / 6.0 auf den Zeitpunkt der Initialisierung
Implementierung der Rails-Sortierfunktion (angezeigt in der Reihenfolge der Anzahl der Gleichen)
[Rails] Implementiere die Event-End-Funktion (logisches Löschen) mit Paranoia (Gem)
[Rails] Ich habe versucht, die Stapelverarbeitung mit der Rake-Task zu implementieren
Implementierung der Ajax-Entfernung in Rails