Ich möchte eine Berechtigungstabelle erstellen (Verwalten von Berechtigungen zum Betreten eines Raums), die Benutzer und Raum verbindet
Referenztyp mit Benutzer und Aufgabe als Spalten
Einschränkung, nicht zu speichern, wenn ein Satz von (Benutzer_ID, Task_ID) eingegeben wird, der bereits in der Tabelle vorhanden ist
Ich möchte auf der Konsole überprüfen, ob diese Überprüfung ordnungsgemäß funktioniert
Diese Validierung kann durch Verwendung der "Eindeutigkeitsbeschränkung" erreicht werden.
Diesmal handelt es sich um eine Aufzeichnung des Vorgangs auf der Konsole, der von Schienen c gestartet wird, um festzustellen, ob dies ordnungsgemäß implementiert ist.
macOS Catalina 10.15.6
ruby 2.6.5
Rails 6.0.3.4
MySQL : 5.6.47
app/models/permission.rb
class Permission < ApplicationRecord
belongs_to :user
belongs_to :task
validates :user_id, uniqueness: { scope: :task_id }
end
Dies ist übrigens eine Einschränkung der Anwendung, und um genau zu sein, muss auch eine Einschränkung auf der DB-Seite angewendet werden (<a href-"https://railsguides.jp/active_record_validations.html#uniqueness:title"> Rails Guide <) Von / a>). Ich verstehe es jedoch noch nicht und werde es diesmal weglassen.
Ich wollte die Eindeutigkeitsbeschränkung überprüfen, also habe ich den Code gemäß dem folgenden Ablauf ausgeführt.
Bestehende Datensätze mit Permission.find (Nummer) abrufen
Einer geeigneten Variablen zuweisen
Überprüfen Sie, ob es mit der gültigen Methode gespeichert werden kann
Wird voraussichtlich "falsch" sein
Ich habe die Konsole im Terminal gestartet und bestätigt.
teminal
$ rails c
[1] > permission = Permission.find(1)
=> #<Permission:*** id: 1, user_id: 1, task_id: 1, ***>
[2] > new.valid?
=> true
Es ist wahr geworden ... Ich dachte über die Ursache nach und änderte den Befehl.
[Ursache] ▶ "find" ist eine ActiveRecord-Methode, die nach vorhandenen Datensätzen sucht ▶ Wenn Sie dies speichern, sieht es dann wie ein überschriebenes Speichern aus?
【Veränderung】 ▶ Geben Sie direkt user_id und task_id ein
terminal
$ rails c
[1] > Permission.find(1)
=> #<Permission:*** id: 1, user_id: 1, task_id: 1, ***>
[2] > permission = Permission.new(user_id: 1, task_id: 1)
=> #<Permission:*** id: nil, user_id: 1, task_id: 1, ***>
[3] > permission.valid?
=> false
[4] > permission.errors.full_messages
=> "User has already been taken"
Ich konnte bestätigen, dass es völlig falsch war.
Die Einschränkung der Eindeutigkeit mehrerer Schlüssel kann mit der Bereichsoption angegeben werden
Erstellen Sie einen neuen Datensatz zur Bestätigung
Ich war ein bisschen süchtig danach, aber ich habe es geschafft, darüber hinwegzukommen. Um wirklich zu verstehen, scheint es notwendig zu sein, zu wissen, was hinter save and valid steckt.
Ich habe noch viel zu lernen, aber ich werde es eins nach dem anderen unterdrücken.
Externes Blog: [Rails] Einzigartige Einschränkungsmethode mit mehreren Spalten [Eindeutigkeit: Gültigkeitsbereich]