[RUBY] [Rails] Implémenter la fonction de fin d'événement (suppression logique) en utilisant la paranoïa (gem)

Qu'est-ce que la suppression logique en premier lieu?

La suppression de Rails ActiveRecord est généralement une suppression physique, qui supprime en fait les données de la base de données. D'autre part, la suppression logique ne supprime pas réellement les données, mais définit une colonne appelée indicateur qui est considérée comme supprimée et se comporte comme si elle était supprimée par l'utilisateur, et peut être restaurée à l'état d'origine si nécessaire. est. Je pense que la suppression logique peut être utilisée dans des cas tels que «Les données de l'utilisateur doivent être conservées pendant un certain temps sur le système même après le retrait de l'utilisateur» ou «Je souhaite geler temporairement le compte en raison d'une violation, etc.» Je vais. Les rails peuvent être facilement implémentés en utilisant une bibliothèque de gemmes appelée paranoïa. Cette gemme est une réimplémentation de la gemme actes_as_paranoid.

Citation (https://remonote.jp/rails-gem-paranoia)

Il y avait un article facile à comprendre, alors je l'ai cité. Normalement, comme mentionné ci-dessus, cela semble être une fonction utilisée lorsque l'utilisateur de gestion a une ** violation, etc. et veut geler temporairement le compte **, mais dans mon cas ** fonction de suppression d'événement et fonction de résiliation Suppression logique implémentée pour séparer. ** **

Qu'est-ce que cela signifie? ** J'aimerais pouvoir voir les événements auxquels l'utilisateur a assisté dans le passé lors de la mise en œuvre de l'application de participation à l'événement. **est devenu. Bien sûr, lorsque l'événement est terminé, les données de l'événement seront supprimées afin qu'elles ne puissent pas être vues dans la liste des événements, mais ce que je voulais mettre en œuvre est ** Cela ne s'affiche pas dans la liste, mais vous pouvez voir l'événement auquel vous avez participé sur la page Ma page de l'utilisateur quelque chose comme. En d'autres termes, bien qu'elles soient supprimées superficiellement, les informations d'enregistrement restent. ** Mais je ne savais pas comment le mettre en œuvre.

Au début, lorsque j'ai supprimé un événement, je cherchais un moyen de déplacer les informations de cet événement vers une table différente, mais lorsque je ne pouvais pas trouver les informations, je pouvais facilement implémenter la suppression logique ** paranoïa **. J'ai trouvé un bijou.

Bien que l'introduction soit devenue longue, je voudrais résumer immédiatement le flux de l'introduction à la mise en œuvre.

étape 1: Introduction

gem 'paranoia'

Comme dans l'exemple bundle install```

Ajoutez ensuite une colonne.

rails g migration AddDeletedAtToEvents deleted_at:datetime:index

Ajoutez une colonne appelée ** supprimé_at ** au modèle d'événement.

class AddDeletedAtToEvents < ActiveRecord::Migration[6.0]
  def change
    add_column :studies, :deleted_at, :datetime
    add_index :studies, :deleted_at
  end
end
rails db:migrate

Enfin, ajoutez actes_as_paranoid au modèle cible.

Event.rb


class Event < ApplicationRecord
  acts_as_paranoid
end

** Installation terminée! !! ** **

étape2: définir le routage

routes.rb


Rails.application.routes.draw do
  root "events#index"
  resources :events do
    member do
      delete 'finish'
    end
  end
end

Puisqu'il n'y a aucune action à terminer parmi les sept actions générées par les ressources, définissez le routage de l'action de fin en imbriquant dans l'événement.

étape: 3 Définissez l'action de finition sur le contrôleur

events_controller.rb


 def destroy
   @event = current_user.events.find(params[:id])
   @event.really_destroy!
   redirect_to root_path, notice: "Supprimé l'événement"
 end

 def finish
   @event = current_user.events.find(params[:id])
   @event.destroy!
   redirect_to root_path, notice: "L'événement est terminé"
  end

La différence entre l'action de destruction et l'action de fin ci-dessus est qu'après @ event, si vous voulez vraiment le supprimer de l'enregistrement, il est décrit comme` `` really_destroy. Ensuite, dans l'action de finition, il est généralement décrit comme `` détruire '', mais comment reste-t-il réellement dans la base de données?

746eace97e67b286975d2e087964212e.png destroyL'enregistrement enregistré est supprimé comme l'image_L'heure de la suppression logique reste dans la colonne appelée à.

étape: 4 Utilisez la méthode find pour récupérer les données supprimées logiquement

users_controller.rb


  def show
     @user=User.find(params[:id])
     @events = @user.events.only_deleted
  end

Puisque nous voulons afficher les événements passés sur la page des détails de l'utilisateur, nous ne pouvons récupérer que les enregistrements supprimés logiquement en écrivant only_deleted dans le contrôleur utilisateur.

Finalement,,

Il semble que la paranoïa puisse utiliser diverses autres méthodes, veuillez donc vous référer au document officiel ^^ Lien officiel (https://github.com/rubysherpas/paranoia)

Merci d'avoir regardé jusqu'à la fin ^^

Recommended Posts

[Rails] Implémenter la fonction de fin d'événement (suppression logique) en utilisant la paranoïa (gem)
Suppression logique grâce à la paranoïa des gemmes
[Ruby on Rails] Suppression logique (fonction de retrait)
Mettre en œuvre la fonction de classement par étoiles en utilisant Raty dans Rails 6
Implémenter la fonction d'application dans Rails
[Rails] Implémenter la fonction de recherche d'utilisateurs
Fonction de recherche à l'aide de [rails] ransack
Implémenter la fonction de catégorie en utilisant l'ancêtre
[Rails] Implémenter la fonction de publication d'images
[Rails] Implémentation d'une fonction de demande / d'approbation d'adhésion à la communauté à l'aide d'associations plusieurs-à-plusieurs
Implémentez une fonction de recherche affinée pour plusieurs modèles sans gemme Rails5.
[Rails] Implémentation de la fonction coupon (avec fonction de suppression automatique par traitement par lots)
[Rails] Fonction de gestion des balises (en utilisant des actes comme des balises)
Implémenter une fonction de connexion simple dans Rails
[Rails] Fonction de commentaire (enregistrement / affichage / suppression)
[Rails] Implémentation de la fonction de catégorie d'ascendance gemme
Implémenter la fonction de téléchargement CSV dans Rails
[Rails] Gérez plusieurs modèles à l'aide de la gemme de devise
Pour implémenter la publication d'images à l'aide de rails
Implémenter des transitions de boutons à l'aide de link_to dans Rails