[RUBY] [Rails6] entwickelt + Paranoia + sowohl das logische Löschen des Benutzers als auch eindeutige Einschränkungen, die in der MySQL8-Serie realisiert wurden

Einführung

In der Titelumgebung hatte ich Mühe, das logische Löschen des Benutzers und die eindeutige Einschränkung auszugleichen. Ich werde die Lösung kurz zusammenfassen. Es gab eine Möglichkeit, die eindeutige Einschränkung der Entwicklung zu überschreiben und ihr eine eigene Einschränkung zu geben. Alle von ihnen sind das Ergebnis der Frage, ob sie einfacher gemacht werden können.

Was du machen willst

Führen Sie in der vorherigen Umgebung (insbesondere in MySQL) ein logisches Löschen anstelle des physischen Löschvorgangs des Standardbenutzers durch. Und ich möchte eine eindeutige Einschränkung sicherstellen, damit sich ein zurückgezogener Benutzer mit derselben Adresse und ID erneut registrieren kann.

PostgreSQL, SQLite Es scheint, dass diese beiden DBs mithilfe des Teilindex leicht implementiert werden können. ・ Implementierungsartikel ・ Add_index-Spezifikation 1 ・ Add_index-Spezifikation 2

Es scheint, dass dieser Teilindex nicht von MySQL übernommen wird und nicht einfach zu handhaben ist. (Da die Informationen nur 5,7 sind, werden sie in 8 Serien übernommen? In beiden Fällen scheint es unmöglich, die Rails zu migrieren.) Es kann leicht Anti-MySQL sein ...

Schlussfolgerung (Implementierungsmethode in MySQL)

Ich denke, Sie können diesen Artikel lesen. https://vanhuyz.com/how-to-apply-unique-restriction-with-soft-delete-in-rails/

  1. Nachdem Sie die Spalte deleted_at hinzugefügt haben,
  2. Geben Sie dem gelöschten_at anstelle von Null einen bestimmten Wert für den aktiven Benutzer Realisiere UNIQUE mit 2 Spalten (nicht realisiert, wenn dollarted_at NULL ist)
  3. Einfaches logisches Löschen und eindeutige Einschränkung

Vielen Dank für den besten Artikel! !!

Implementierung

[Umgebung]

Vorbereitung

Da es viele andere Artikel über die Implementierung grundlegender Teile gibt, wie z. B. Umgebungskonstruktion und Entwicklung, Einführung in Paranoia, werde ich darauf verzichten. Voraussetzung ist, dass die Standardfunktion zur Registrierung / Auszahlung von Mitgliedschaften usw. funktioniert.

1. Erstellen Sie eine Konfigurationsdatei paranoia.rb

config/initializers/paranoia.rb


#Verarbeitung, um sowohl logisches Löschen als auch eindeutige Einschränkungen nach dem Zurückziehen des Benutzers zu erreichen
#Nicht gelöschte Datensätze werden gelöscht_at = '0000-01-01 00:00:00'
#Gelöschter Datensatz wird gelöscht_at != '0000-01-01 00:00:00'
Paranoia.default_sentinel_value = DateTime.new(0)

2. Indexänderung bei der Migration

Erstellen Sie eine Migrationsdatei, die den Index der Standardbenutzertabelle ändert

rails g Change_Index_To_Users

Ändern Sie die erstellte Migrationsdatei wie folgt

Erstellen Sie einen neuen eindeutigen Index mit [email, deleted_at]

db/migrate/202009220000000.rb


class ChangeIndexUniuqueToUsers < ActiveRecord::Migration[6.0]
  def change
    remove_index :users, :email
    add_index :users, [:email,:deleted_at], unique: true
  end
end

migration

rails db:migrate

3. Validierung hinzufügen

Validierung auf Anwendungsebene hinzugefügt

app/models/user.rb


class User < ActiveRecord::Base
  acts_as_paranoid
  validates :email, uniqueness: { scope: :deleted_at }	

4. Funktionsprüfung

Starten Sie die Rails-Konsole oder den Rails-Server, erstellen Sie einen Benutzer, melden Sie sich ab und registrieren Sie sich erneut mit derselben Adresse, um die Datenbank zu überprüfen. 論理削除_一意制約.PNG

Sie haben sich erfolgreich mit derselben Adresse neu registriert! !! Bitte lassen Sie mich wissen, ob es einen anderen guten Weg gibt!

Recommended Posts

[Rails6] entwickelt + Paranoia + sowohl das logische Löschen des Benutzers als auch eindeutige Einschränkungen, die in der MySQL8-Serie realisiert wurden
Implementieren Sie die Benutzerregistrierungsfunktion und die Unternehmensregistrierungsfunktion separat in Rails devise
[Rails] Implementierung des logischen Löschens durch den Benutzer
Führen Sie devise with Rails ein, um Benutzerverwaltungsfunktionen zu implementieren