[RUBY] [Rails] Implémentation de la fonction coupon (avec fonction de suppression automatique par traitement par lots)

Cible

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

Environnement de développement

・ Rubis: 2.5.7 Rails: 5.2.4 ・ Vagrant: 2.2.7 -VirtualBox: 6.1 ・ Système d'exploitation: macOS Catalina

supposition

Ce qui suit a été mis en œuvre.

Présentation minceIntroduction de Bootstrap 3

la mise en oeuvre

1. Ajouter une colonne

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:Ajouter "vrai"
      t.integer :limit

      t.timestamps
    end
  end
end

Terminal


$ rails db:migrate

2. Modifiez le modèle

user.rb


#Postscript
has_many :coupons, dependent: :destroy

coupon.rb


class Coupon < ApplicationRecord
  belongs_to :user

  enum is_valid: { 'Efficacité': true, 'Invalide': 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 == 'Efficacité'
        coupon.is_valid = 'Invalide'
        coupon.save
      end
    end
  end
end

[Explication]

① Gérez le statut des coupons avec enum.

enum is_valid: { 'Efficacité': true, 'Invalide': false }

② Définissez une méthode pour créer un coupon.

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

③ Définissez une méthode pour supprimer le coupon.

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 == 'Efficacité'
      coupon.is_valid = 'Invalide'
      coupon.save
    end
  end
end

** ◎ Si 24 heures se sont écoulées depuis la création du coupon et que son statut est valide, changez-le en invalide et enregistrez-le. ** **

if coupon.created_at + coupon.limit.minutes < time && coupon.is_valid == 'Efficacité'
  coupon.is_valid = 'Invalide'
  coupon.save
end

3. Créez / modifiez 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: 'Efficacité') 
  end
end

4. Modifiez books_controller.rb

Cette fois, nous allons l'implémenter afin qu'un coupon soit émis lorsque le livre est publié avec succès.

books_controller.rb


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

5. Modifiez les paramètres de date et d'heure

① Modifiez ʻapplication.rb`.

application.rb


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

(2) Créer / modifier un fichier pour définir le format de la date et de l'heure

Terminal


$ touch config/initializers/time_formats.rb

time_formats.rb


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

6. Modifier la vue

slim:coupons/index.html.slim


.row
  .col-xs-3

  .col-xs-6
    table.table
      thead
        tr
          th
            |Numéro de coupon
          th
            |Titre

      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

[Explication]

① Afficher un jour après la date et l'heure de création du coupon dans le format défini dans «5».

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

7. Mise en œuvre de la fonction de suppression automatique

① Présentez Gem

Gemfile


#Postscript
gem 'whenever', require: false

Terminal


$ bundle

② Créez et éditez " schedule.rb "

Terminal


$ bundle exec wheneverize .

config/schedule.rb


env :PATH, ENV['PATH'] #Spécifiez un chemin relatif à partir d'un chemin absolu
set :output, 'log/cron.log' #Définir le fichier de destination de sortie du journal
set :environment, :development #Définir l'environnement

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

4. Refléter «cron»

Terminal


$ bundle exec whenever --update-crontab

Commandes souvent utilisées dans le traitement par lots

crontab -e ➡︎ Editer cron sur le terminal

$ bundle exec chaque fois ➡︎ Vérifiez les paramètres cron

$ bundle exec chaque fois que --update-crontab ➡︎ Reflect cron

$ bundle exec chaque fois que --clear-crontab ➡︎ Supprimer cron

Recommended Posts

[Rails] Implémentation de la fonction coupon (avec fonction de suppression automatique par traitement par lots)
[Rails] Implémentation de la fonction de recherche en utilisant le ransack de gem
[Rails] Implémentation de la fonction d'agrandissement d'image à l'aide de lightbox2
[Rails] Implémentation de la fonction glisser-déposer (avec effet)
[Rails] Implémentation de la fonction de catégorie multicouche en utilisant l'ascendance "Préparation"
[Rails] Implémentation de la fonction de catégorie
[Rails] Implémentation de la fonction de catégorie multicouche à l'aide de l'ascendance "seed edition"
[Rails] Implémentation de la fonction tutoriel
[Rails] Implémentation d'une fonction similaire
[Rails] Implémentation de la fonction de catégorie multicouche en utilisant l'ascendance "Edit Form Edition"
[Rails] Implémentation de la saisie d'adresse automatique avec jpostal et jp_prefecture
[Rails] Implémentation de la fonction de catégorie multicouche à l'aide de l'ascendance "Formulaire de création"
[Rails] Implémentation de la suppression logique utilisateur
[Rails] Implémentation de la fonction d'importation CSV
[Rails] Implémentation asynchrone de la fonction similaire
[Rails] À propos de la mise en œuvre de la fonction similaire
[Rails] Implémentation de la fonction de retrait utilisateur
[Rails] Implémentation de la fonction d'exportation CSV
[Rails] Implémentation d'une nouvelle fonction d'enregistrement au format assistant à l'aide de devise
[Rails] Implémentation de la fonction de balise à l'aide de la fonction agit-as-taggable-on et de la fonction de complétion d'entrée de balise à l'aide de tag-it
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (2)
[Rails] Implémentation de la fonction de catégorie multicouche en utilisant l'ascendance "J'ai essayé de créer une fenêtre avec Bootstrap 3"
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (1)
Rails [Pour les débutants] Implémentation de la fonction de commentaire
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (3)
[Ruby on rails] Implémentation d'une fonction similaire
[Rails] Je vais expliquer la procédure d'implémentation de la fonction follow en utilisant form_with.
Implémentation de la fonction de connexion Ruby on Rails (Session)
Ruby on Rails Implémentation de la fonction d'envoi automatique de courrier
[Rails] Mise en œuvre du classement des nombres PV à l'aide de l'impressionniste
[Rails] Implémentation du diaporama d'images à l'aide de Bootstrap 3
Implémentation de la fonction de connexion Ruby on Rails (édition de devise)
Implémentation de la fonction de recherche
Utilisation de l'API PAY.JP avec Rails ~ Préparation de l'implémentation ~ (payjp.js v2)
Mise en œuvre de la fonction de pagénation
Contrôlez le flux de traitement Spring Batch avec JavaConfig.
Implémentation de la fonction Rails CRUD ① (nouvel ajout, suppression cette fois)
À propos de l'implémentation du traitement de fusion, y compris la fonction de tri de l'API Stream
Ruby on Rails Paramètre de la fonction d'envoi automatique des e-mails (avec Gmail)
Faites attention au moment d'initialisation lors de l'utilisation de MessageEncryptor avec Rails 5.2 / 6.0
Mise en place de la fonction de tri des rails (affichés par ordre de nombre de like)
[Rails] Implémenter la fonction de fin d'événement (suppression logique) en utilisant la paranoïa (gem)
[Rails] J'ai essayé d'implémenter le traitement par lots avec la tâche Rake
Implémentation de la suppression d'ajax dans Rails