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.
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 ...
Ich denke, Sie können diesen Artikel lesen. https://vanhuyz.com/how-to-apply-unique-restriction-with-soft-delete-in-rails/
Vielen Dank für den besten Artikel! !!
[Umgebung]
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.
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)
rails g Change_Index_To_Users
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
app/models/user.rb
class User < ActiveRecord::Base
acts_as_paranoid
validates :email, uniqueness: { scope: :deleted_at }
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.
Sie haben sich erfolgreich mit derselben Adresse neu registriert! !! Bitte lassen Sie mich wissen, ob es einen anderen guten Weg gibt!
Recommended Posts