[RUBY] [Rails] Implementiere die Event-End-Funktion (logisches Löschen) mit Paranoia (Gem)

Was ist logisches Löschen überhaupt?

Rails ActiveRecord delete ist normalerweise ein physischer Löschvorgang, bei dem die Daten tatsächlich aus der Datenbank gelöscht werden. Andererseits löscht das logische Löschen die Daten nicht tatsächlich, sondern setzt eine Spalte, die als Flag bezeichnet wird und als gelöscht gilt. Sie verhält sich so, als würde sie vom Benutzer gelöscht und kann bei Bedarf in den ursprünglichen Zustand zurückversetzt werden. ist. Ich denke, dass das logische Löschen in Fällen wie "Die Benutzerdaten müssen für einen bestimmten Zeitraum auf dem System gespeichert bleiben, auch nachdem der Benutzer zurückgezogen wurde" oder "Ich möchte das Konto aufgrund eines Verstoßes vorübergehend sperren usw." verwendet werden kann. Ich werde. Schienen können mithilfe einer Edelsteinbibliothek namens Paranoia einfach implementiert werden. Dieser Edelstein ist eine Neuimplementierung des Edelsteins Acts_as_paranoid.

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

Es gab einen leicht verständlichen Artikel, deshalb habe ich ihn zitiert. Normalerweise scheint es, wie oben erwähnt, eine Funktion zu sein, die verwendet wird, wenn der Verwaltungsbenutzer eine ** Verletzung usw. hat und das Konto vorübergehend einfrieren möchte **, aber in meinem Fall ** Ereignislösch- und Beendigungsfunktion Logisches Löschen zum Trennen implementiert. ** ** **

Was bedeutet das? ** Ich wünschte, ich könnte die Ereignisse sehen, an denen der Benutzer in der Vergangenheit teilgenommen hat, während er die Anwendung zur Teilnahme an Veranstaltungen implementiert hat. **ist geworden. Wenn das Ereignis beendet ist, werden die Ereignisdaten natürlich gelöscht, sodass sie nicht in der Ereignisliste angezeigt werden. Ich wollte jedoch Folgendes implementieren: ** Sie werden nicht in der Liste angezeigt, aber Sie können das Ereignis, an dem Sie teilgenommen haben, auf der Seite "Meine Seite" des Benutzers sehen etwas wie. Mit anderen Worten, obwohl es oberflächlich gelöscht wird, bleiben die Datensatzinformationen erhalten. ** Aber ich wusste nicht, wie ich es implementieren sollte.

Als ich ein Ereignis löschte, suchte ich zunächst nach einer Möglichkeit, die Informationen dieses Ereignisses in eine andere Tabelle zu verschieben. Wenn ich die Informationen jedoch nicht finden konnte, konnte ich das logische Löschen ** paranoia ** problemlos implementieren. Ich habe ein Juwel gefunden.

Obwohl die Einführung lang geworden ist, möchte ich den Ablauf von der Einführung bis zur Implementierung sofort zusammenfassen.

Schritt 1: Einführung

gem 'paranoia'

Wie im Beispiel `` `Bundle Install```

Fügen Sie dann eine Spalte hinzu.

rails g migration AddDeletedAtToEvents deleted_at:datetime:index

Fügen Sie dem Ereignismodell eine Spalte mit dem Namen ** deleted_at ** hinzu.

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

Fügen Sie schließlich Acts_as_paranoid zum Zielmodell hinzu.

Event.rb


class Event < ApplicationRecord
  acts_as_paranoid
end

** Installation abgeschlossen! !! ** ** **

Schritt 2: Legen Sie das Routing fest

routes.rb


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

Da unter den sieben von Ressourcen generierten Aktionen keine Aktion zu beenden ist, legen Sie das Routing der Zielaktion durch Verschachteln im Ereignis fest.

Schritt: 3 Definieren Sie die Zielaktion auf dem Controller

events_controller.rb


 def destroy
   @event = current_user.events.find(params[:id])
   @event.really_destroy!
   redirect_to root_path, notice: "Ereignis gelöscht"
 end

 def finish
   @event = current_user.events.find(params[:id])
   @event.destroy!
   redirect_to root_path, notice: "Die Veranstaltung ist beendet"
  end

Der Unterschied zwischen der Zerstörungsaktion und der Zielaktion oben besteht darin, dass nach @ event```, wenn Sie es wirklich aus dem Datensatz löschen möchten, es als `wirklich_destroy``` beschrieben wird. In der Zielaktion wird es dann normalerweise als "Zerstören" beschrieben, aber wie bleibt es tatsächlich in der Datenbank?

746eace97e67b286975d2e087964212e.png destroyDer aufgezeichnete Datensatz wird wie das Bild gelöscht_Der Zeitpunkt des logischen Löschens verbleibt in der aufgerufenen Spalte.

Schritt: 4 Verwenden Sie die Suchmethode, um die logisch gelöschten Daten abzurufen

users_controller.rb


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

Da wir vergangene Ereignisse auf der Benutzerdetailseite anzeigen möchten, können wir nur die logisch gelöschten Datensätze abrufen, indem wir "` only_deleted`` "in die Benutzersteuerung schreiben.

Schließlich,,

Es scheint, dass Paranoia verschiedene andere Methoden anwenden kann. Bitte beziehen Sie sich auf das offizielle Dokument ^^ Offizieller Link (https://github.com/rubysherpas/paranoia)

Danke fürs Zuschauen bis zum Ende ^^

Recommended Posts

[Rails] Implementiere die Event-End-Funktion (logisches Löschen) mit Paranoia (Gem)
Logisches Löschen mit Gem Paranoia
[Ruby on Rails] Logisches Löschen (Auszahlungsfunktion)
Implementieren Sie die Sternebewertungsfunktion mit Raty in Rails 6
Implementieren Sie die Anwendungsfunktion in Rails
[Schienen] Implementieren Sie die Benutzersuchfunktion
Suchfunktion mit [Rails] Ransack
Implementieren Sie die Kategoriefunktion mithilfe von Vorfahren
[Rails] Implementieren Sie die Image-Posting-Funktion
[Rails] Implementieren Sie die Funktion zur Beantragung / Genehmigung einer Community-Mitgliedschaft mithilfe von Many-to-Many-Zuordnungen
Implementieren Sie eine verfeinerte Suchfunktion für mehrere Modelle ohne Rails5-Juwel.
[Rails] Implementierung der Couponfunktion (mit automatischer Löschfunktion mittels Stapelverarbeitung)
[Rails] Tag-Verwaltungsfunktion (unter Verwendung von Acts-as-Taggable-On)
Implementieren Sie eine einfache Anmeldefunktion in Rails
[Rails] Kommentarfunktion (Registrierung / Anzeige / Löschung)
Implementierung der Funktionsfunktion [Rails] gem ancestry category
Implementieren Sie die CSV-Download-Funktion in Rails
[Schienen] Verwalten Sie mehrere Modelle mit einem Edelstein
So implementieren Sie die Image-Veröffentlichung mithilfe von Schienen
Implementieren Sie Schaltflächenübergänge mit link_to in Rails