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.
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! !! ** **
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.
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?
destroy
L'enregistrement enregistré est supprimé comme l'image_L'heure de la suppression logique reste dans la colonne appelée à.
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.
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