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.
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! !! ** ** **
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.
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?
destroy
Der aufgezeichnete Datensatz wird wie das Bild gelöscht_Der Zeitpunkt des logischen Löschens verbleibt in der aufgerufenen Spalte.
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.
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